<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kopier-Konstruktor]]></title><description><![CDATA[<p>Als Anfänger stehe ich gerade auf dem Schlauch: Ich habe folgenden Code mit dem GNU-Compiler 4.6.3 übersetzt:</p>
<pre><code>#include &lt;iostream&gt;

class Test
{
private:
    int data;
public:
    explicit Test(int i) : data(i) {
        std::cout &lt;&lt; &quot;Constuctor&quot; &lt;&lt; std::endl;
    }
    Test(const Test&amp; t) {
        this-&gt;data = t.data;
        std::cout &lt;&lt; &quot;Copy-Constructor&quot; &lt;&lt; std::endl;
    }
};

int main()
{
    Test t1(1);
    Test t2(t1);
    Test t3(Test(2));
}
</code></pre>
<p>Erwartet hätte ich:<br />
`</p>
<p>Constructor</p>
<p>Copy-Constructor</p>
<p>Constructor</p>
<p>Copy-Constructor</p>
<p>`</p>
<p>Ergebnis ist aber:<br />
`</p>
<p>Constructor</p>
<p>Copy-Constructor</p>
<p>Constructor</p>
<p>`</p>
<p>Wie wird denn t3 initialisiert? Nicht über den Copy-Constructor???</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/314786/kopier-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 01:20:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314786.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 13 Mar 2013 23:11:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kopier-Konstruktor on Wed, 13 Mar 2013 23:11:06 GMT]]></title><description><![CDATA[<p>Als Anfänger stehe ich gerade auf dem Schlauch: Ich habe folgenden Code mit dem GNU-Compiler 4.6.3 übersetzt:</p>
<pre><code>#include &lt;iostream&gt;

class Test
{
private:
    int data;
public:
    explicit Test(int i) : data(i) {
        std::cout &lt;&lt; &quot;Constuctor&quot; &lt;&lt; std::endl;
    }
    Test(const Test&amp; t) {
        this-&gt;data = t.data;
        std::cout &lt;&lt; &quot;Copy-Constructor&quot; &lt;&lt; std::endl;
    }
};

int main()
{
    Test t1(1);
    Test t2(t1);
    Test t3(Test(2));
}
</code></pre>
<p>Erwartet hätte ich:<br />
`</p>
<p>Constructor</p>
<p>Copy-Constructor</p>
<p>Constructor</p>
<p>Copy-Constructor</p>
<p>`</p>
<p>Ergebnis ist aber:<br />
`</p>
<p>Constructor</p>
<p>Copy-Constructor</p>
<p>Constructor</p>
<p>`</p>
<p>Wie wird denn t3 initialisiert? Nicht über den Copy-Constructor???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306523</guid><dc:creator><![CDATA[Ulrike_1992]]></dc:creator><pubDate>Wed, 13 Mar 2013 23:11:06 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Wed, 13 Mar 2013 23:20:31 GMT]]></title><description><![CDATA[<p>Mit <code>Test(2)</code> erzeugst du ein temporäres Objekt, welches der Compiler in diesem Fall eliminieren darf (Stichwort: Copy Elision) und genau das passiert in deinem Beispiel offenbar auch... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306526</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 13 Mar 2013 23:20:31 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Wed, 13 Mar 2013 23:22:19 GMT]]></title><description><![CDATA[<p>Da greift die sogenannte copy elision. Das ist eine vom Sprachstandard explizit erlaubte Optimierung, bei der unnötige Kopien selbst dann wegoptimiert werden dürfen, wenn dadurch das beobachtbare Verhalten des Programms (hier Ausgabe im Konstruktor) verändert wird (das darf sonst bei keiner Optimierung passieren).</p>
<p>Guckst du zum Beispiel hier:<br />
<a href="http://en.wikipedia.org/wiki/Copy_elision" rel="nofollow">http://en.wikipedia.org/wiki/Copy_elision</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306527</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 13 Mar 2013 23:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Wed, 13 Mar 2013 23:51:04 GMT]]></title><description><![CDATA[<p>Ihr habt tatsächlich recht: Wenn ich die Kompiler-Option <code>-fno-elide-constructors</code> setze, habe ich mein erwartetes Verhalten. Verstehe ich das richtig? Der Compiler sieht die Zeile:</p>
<pre><code>Test t3(Test(2));
</code></pre>
<p>und denkt sich: Ich soll <code>t3</code> erzeugen das identisch ist mit <code>Test(2)</code> ? Dann rufe ich doch direkt <code>Test t3(2)</code> auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306531</guid><dc:creator><![CDATA[Ulrike_1992]]></dc:creator><pubDate>Wed, 13 Mar 2013 23:51:04 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 00:04:48 GMT]]></title><description><![CDATA[<p>Ulrike_1992 schrieb:</p>
<blockquote>
<p>Verstehe ich das richtig? Der Compiler sieht die Zeile:</p>
<pre><code>Test t3(Test(2));
</code></pre>
<p>und denkt sich: Ich soll <code>t3</code> erzeugen das identisch ist mit <code>Test(2)</code> ? Dann rufe ich doch direkt <code>Test t3(2)</code> auf.</p>
</blockquote>
<p>jap</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306532</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 14 Mar 2013 00:04:48 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 08:35:16 GMT]]></title><description><![CDATA[<p>Noch eine Frage habe ich: Angenommen, meine Klasse hat einen Kopierkonstruktor und einen Zuweisungsoperator: Bei einer Initialisierung mit einem Objekt in der Form</p>
<pre><code>Test t3(Test(2));
</code></pre>
<p>erwartet man nun den Aufruf des Kopierkonstruktors <code>Test::Test(const Test&amp;)</code> oder eine Eliminierung des temporären Objekts. Dürfte der Compiler aber stattdessen auch einen Zuweisungsoperator <code>const Test&amp; Test::operator=(const Test&amp;)</code> verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306574</guid><dc:creator><![CDATA[Ulrike_1992]]></dc:creator><pubDate>Thu, 14 Mar 2013 08:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 09:13:06 GMT]]></title><description><![CDATA[<p>Nein, hier liegt ja keine Zuweisung vor. Ein Konstruktor erschafft aus dem Nichts (bzw. aus rohem Speicher) ein neues Objekt, ein Zuweisungsoperator verändert ein bestehendes Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306589</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 14 Mar 2013 09:13:06 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 09:24:41 GMT]]></title><description><![CDATA[<p>So als Zusatzinfo, da es mich beim ersten Mal sehr überrascht hat und sicherlich auch einige andere überraschen wird: Selbst wenn keine richtige Kopie erstellt wird, darf sie wegoptimiert werden:</p>
<pre><code>struct Foo
{
  int blah;
  Foo(int i) : blah(i) { cout &lt;&lt; &quot;Konstruktor &quot; &lt;&lt; blah &lt;&lt; '\n'; }
  Foo(const Foo&amp; other): blah(1) {cout &lt;&lt; &quot;Falscher Kopierkonstruktor &quot; &lt;&lt; blah &lt;&lt; '\n'; }
};

int main()
{
  Foo t1(5);
  Foo t2(t1);
  Foo t3(Foo(7));
  cout &lt;&lt; t3.blah &lt;&lt; '\n';
}
</code></pre>
<p>Hier darf (und wird) tatsächlich 7 anstatt 1 ausgegeben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306591</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 14 Mar 2013 09:24:41 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 13:09:56 GMT]]></title><description><![CDATA[<p>Könnte es auch nicht passieren, dass der Compiler zunächst ein leeres Objekt erzeugt und anschließend über den Zuweisungsoperator das Objekt initialisiert? Damit meine ich: Darf der Compiler einen Ausdruck wie</p>
<pre><code>Test t3(Test(2));
</code></pre>
<p>ersetzen durch etwas Ähnlichem wie:</p>
<pre><code>Test t3(0);
t3.operator=(Test(2));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2306653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306653</guid><dc:creator><![CDATA[Ulrike_1992]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:09:56 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 13:12:39 GMT]]></title><description><![CDATA[<p>Nein. Selbst das hier</p>
<pre><code>Foo f = Foo(4);
// oder
Foo f2 = 4;
</code></pre>
<p>Ist kein Zuweisungsoperator, sondern der Kopierkonstruktor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306657</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:12:39 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 13:16:41 GMT]]></title><description><![CDATA[<p>Nein darf er nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306660</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:16:41 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 13:33:59 GMT]]></title><description><![CDATA[<p>Aber in 2 Schritten doch nicht, oder?</p>
<pre><code>Foo f = Foo(4);
f = Foo(5);
</code></pre>
<p>Erste Zeile: Initialisierung und damit Kopierkonstruktor oder Konstruktor mit Eliminierung des temporären Objekts. Zweite Zeile: Zuweisung. Die Frage wäre, ob der Compiler einen Initialisierungsausdruck umwandeln darf in eine Art Zweizeiler mit Zuweisung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306674</guid><dc:creator><![CDATA[Ulrike_1992]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:33:59 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 13:34:48 GMT]]></title><description><![CDATA[<p>Nein darf er nicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306677</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:34:48 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 13:35:55 GMT]]></title><description><![CDATA[<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306679</guid><dc:creator><![CDATA[Ulrike_1992]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:35:55 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 13:42:39 GMT]]></title><description><![CDATA[<p>Wie soll er denn zuerst ein &quot;leeres&quot; Objekt erstellen? Definier mal &quot;leer&quot; in C++-Sprech, dann siehst du, warum das nicht gehen kann (außer in Ausnahmefällen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306686</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:42:39 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 13:52:08 GMT]]></title><description><![CDATA[<p>Mit &quot;leerem Objekt&quot; meine ich: Der Compiler macht nur Speicher für das Objekt frei ohne irgendwelche Komponenten zu initialisieren. Danach Zuweisung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306691</guid><dc:creator><![CDATA[Ulrike_1992]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:52:08 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 13:59:22 GMT]]></title><description><![CDATA[<p>Ulrike_1992 schrieb:</p>
<blockquote>
<p>Mit &quot;leerem Objekt&quot; meine ich: Der Compiler macht nur Speicher für das Objekt frei ohne irgendwelche Komponenten zu initialisieren. Danach Zuweisung.</p>
</blockquote>
<p>Und genau das ist bei komplexen Datentypen nicht möglich. Denk mal nach, wie zum Beispiel der Zuweisungsoperator eines vectors aussehen muss. Der muss irgendwo den Speicher des überschriebenen vectors freigeben. Wenn der interne Datenzeiger aber niemals initialisiert wurde und stattdessen irgendeinen Müllwert hat, dann stürzt das zur Laufzeit ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306696</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 14 Mar 2013 13:59:22 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 14:10:25 GMT]]></title><description><![CDATA[<p>Jain, das wäre ja genau der Zeitpunkt im operator new, wenn gearde Speicher allokiert wurde, aber der Konstruktor noch nicht aufgerufen wurde.</p>
<p>Aber letztlich hat SeppJ recht, hör auf ihn. Denn wenn du irgendwelche Spielereien im Speicher machen willst, kommst du schneller in Teufels Küche als der Teufel persönlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306702</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 14 Mar 2013 14:10:25 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 14:35:52 GMT]]></title><description><![CDATA[<p>Die einzige sinnvolle Definition für &quot;leeres&quot; Objekt ist ein default-konstruiertes Objekt (also mit dem Konstruktor ohne Argumente). Es hat aber nicht jede Klasse einen Default-Konstruktor, so dass das nicht allgemein funktionieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306712</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 14 Mar 2013 14:35:52 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 23:10:46 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Die einzige sinnvolle Definition für &quot;leeres&quot; Objekt ist ein default-konstruiertes Objekt (also mit dem Konstruktor ohne Argumente). Es hat aber nicht jede Klasse einen Default-Konstruktor, so dass das nicht allgemein funktionieren kann.</p>
</blockquote>
<p>Meine Frage war weniger, ob es dem Compiler <strong>immer</strong> erlaubt ist, den Kopierkonstruktor durch eine Art Zuweisung zu ersetzen. Meine Frage ist mehr, ob der Compiler unter bestimmten Umständen, z.B. wenn ein Default-Konstruktor vorhanden ist, eine Initialisierung durch einen Kopier-Konstruktor dadurch ersetzen darf, dass er erst ein &quot;default&quot;-Objekt erzeugt, und anschließend mit einer Zuweisung dessen Komponenten initialisiert. Eigentlich sollten doch Kopier-Konstruktor und Zuweisungs-Operator eng miteinander verwandt sein. Ein Ausdruck wie</p>
<pre><code>class Foo
...
Foo f;
Foo g(f);
</code></pre>
<p>sollte doch das Gleiche bewirken wie</p>
<pre><code>Foo f;
Foo g;
g = f;
</code></pre>
<p>Folgende Klasse <code>Foo</code> würde diese Erwartung erfüllen:</p>
<pre><code>struct Foo
{
    int x;
    Foo() : x(0) {}
    Foo(const Foo&amp; f) {
        this-&gt;operator=(f);
    }
    const Foo&amp; operator=(const Foo&amp; f) {
        this-&gt;x = f.x;
        return *this;
    }
};
</code></pre>
<p>Nun können anscheinend Kopier-Konstruktor und Zuweisungs-Operator unsinnigerweise so definiert sein, dass sie etwas vollkommen Anderes bewirken. Aber der Compiler könnte möglicherweise davon ausgehen, dass beide Komponenten dasselbe bewirken und ersetzt möglicherweise den Rumpf des Kopier-Konstruktors durch <code>this-&gt;operator=(irgendwas)</code> Ich frage mich einfach: Wie weit darf der Compiler das erwartete Verhalten zugunsten einer Optimierung verändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306828</guid><dc:creator><![CDATA[Ulrike_1992]]></dc:creator><pubDate>Thu, 14 Mar 2013 23:10:46 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Thu, 14 Mar 2013 23:15:21 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich frage mich einfach: Wie weit darf der Compiler das erwartete Verhalten zugunsten einer Optimierung verändern.</p>
</blockquote>
<p>Grundsätzlich: Überhaupt nicht. Die Auslassung von Kopien ist die einzige Ausnahme von dieser Regel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306829</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 14 Mar 2013 23:15:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Fri, 15 Mar 2013 09:54:11 GMT]]></title><description><![CDATA[<p>Ulrike_1992 schrieb:</p>
<blockquote>
<pre><code>class Foo
...
Foo f;
Foo g(f);
</code></pre>
<p>sollte doch das Gleiche bewirken wie</p>
<pre><code>Foo f;
Foo g;
g = f;
</code></pre>
</blockquote>
<p>Eher genau umgekehrt:</p>
<pre><code>Foo f;
Foo g = f;
// oder
Foo g;
g = f;
</code></pre>
<p>Wird zu:</p>
<pre><code>Foo f;
Foo g(f);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2306876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306876</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Fri, 15 Mar 2013 09:54:11 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Fri, 15 Mar 2013 16:45:25 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<pre><code>Foo f;
Foo g = f;
// oder
Foo g;
g = f;
</code></pre>
<p>Wird zu:</p>
<pre><code>Foo f;
Foo g(f);
</code></pre>
</blockquote>
<p>Dass ein Ausdruck wie <code>Foo g = f</code> eine andere Schreibweise ist für <code>Foo g(f)</code> ist mir schon bewusst. Worauf ich hinaus wollte ist, dass eine Initialisierung der Form <code>Foo g(f)</code> ein Objekt erzeugen sollte, das inhaltlich gleich ist mit einem Objekt, das zunächst mit dem Default-Konstruktor <code>Foo g</code> erzeugt wurde und das man anschließend in einer Zuweisung <code>g = f</code> ändert.</p>
<p>Aus dem Grund sollte es dem Compiler eigentlich möglich sein, einen Kopierkonstruktor zu erzeugen, wenn er den Zuweisungsoperator kennt. Er würde dann einfach den Funktionsrumpf des Kopierkonstruktors ersetzen durch <code>this-&gt;operator=(foo_objekt_oder_wie_immer_die_Klasse_lautet)</code> .</p>
<p>Ein Programmierer könnte aber den Kopierkonstruktor und den Zuweisungsoperator so definieren, dass überraschenderweise ein Dreizeiler wie</p>
<pre><code>Foo f;
Foo g;
g = f;
</code></pre>
<p>ein Objekt <code>g</code> erzeugt, das sich inhaltlich unterscheidet von dem Objekt <code>g</code> , das erzeugt wird durch folgenden Zweizeiler:</p>
<pre><code>Foo f;
Foo g(f);
</code></pre>
<p>Wie ich ja jetzt gelernt habe, geht der Compiler (<em>Copy Elision</em>) davon aus, dass das Objekt <code>f</code> das durch einen Kopier-Konstruktor (mit temporärem Objekt) erzeugt wird:</p>
<pre><code>Foo f(Foo(p1, p2, p3));
</code></pre>
<p>inhaltlich identisch ist mit dem Objekt <code>f</code> das durch den Aufruf eines Konstruktors mit Parameterliste erzeugt wird:</p>
<pre><code>Foo f(p1, p2, p3);
</code></pre>
<p>Auch wenn der Kopierkonstruktor (unsinnigerweise) so definiert sein könnte, dass er eigentlich ein ganz anderes Objekt erzeugen sollte als über einen Konstruktor mit Parameterliste.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306969</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306969</guid><dc:creator><![CDATA[Ulrike_1992]]></dc:creator><pubDate>Fri, 15 Mar 2013 16:45:25 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Fri, 15 Mar 2013 16:54:11 GMT]]></title><description><![CDATA[<p>Ulrike_1992 schrieb:</p>
<blockquote>
<p>Aus dem Grund sollte es dem Compiler eigentlich möglich sein, einen Kopierkonstruktor zu erzeugen, wenn er den Zuweisungsoperator kennt. Er würde dann einfach den Funktionsrumpf des Kopierkonstruktors ersetzen durch <code>this-&gt;operator=(foo_objekt_oder_wie_immer_die_Klasse_lautet)</code> .</p>
</blockquote>
<p>Nein, das geht eben nicht. Ein Gegenbeispiel wurde dir schon genannt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306972</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 15 Mar 2013 16:54:11 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Fri, 15 Mar 2013 18:16:21 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ein Gegenbeispiel wurde dir schon genannt.</p>
</blockquote>
<p>Ich muss leider zugeben, dass ich den Punkt noch nicht verstanden habe. Ich nehme an, du meinst das Beispiel mit dem <code>vector</code> . Aber erzeugen nicht folgende zwei Codefragmente den inhaltlich gleichen <code>vector v2</code> ?</p>
<p>Version 1:</p>
<pre><code>std::vector&lt;int&gt; v1;
v1.push_back(3);
std::vector&lt;int&gt; v2;
v2 = v1;
</code></pre>
<p>Version 2:</p>
<pre><code>std::vector&lt;int&gt; v1;
v1.push_back(3);
std::vector&lt;int&gt; v2(v1);
</code></pre>
<p>Könnte der Compiler nicht <em>Version 1</em> durch <em>Version 2</em> ersetzen?</p>
<ul>
<li>Version 1: 2 x Default-Konstruktor + 1 x Zuweisung</li>
<li>Version 2: 1 x Default-Konstruktor + 1 x Kopierkonstruktor</li>
</ul>
<p>Ich weiß ja nicht wie der Kopierkonstruktor für <code>vector</code> implementiert ist, aber <code>Version 2</code> könnte schneller sein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306991</guid><dc:creator><![CDATA[Ulrike_1992]]></dc:creator><pubDate>Fri, 15 Mar 2013 18:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to Kopier-Konstruktor on Fri, 15 Mar 2013 18:41:13 GMT]]></title><description><![CDATA[<p>Ulrike_1992 schrieb:</p>
<blockquote>
<p>Könnte der Compiler nicht <em>Version 1</em> durch <em>Version 2</em> ersetzen?</p>
<ul>
<li>Version 1: 2 x Default-Konstruktor + 1 x Zuweisung</li>
<li>Version 2: 1 x Default-Konstruktor + 1 x Kopierkonstruktor</li>
</ul>
</blockquote>
<p>Nö, das ist doch syntaktisch und semantisch total was anderes. Hab den Thread jetzt nicht gelesen, aber kennst du den Unterschied zwischen Initialisierung und Zuweisung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2306995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2306995</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Fri, 15 Mar 2013 18:41:13 GMT</pubDate></item></channel></rss>