<?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[Copy-Constructor und operator*]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich habe eine Frage bezüglich Copy-Konstruktor und dem Operator*. Ich mache gerade ein Softwarepraktikum an der Uni und soll dort Datentypen entwerfen. Ich habe aber leider ein Problem mit dem CoyConstructor. Wenn ich ein Objekt folgendermaßen initialisiere:</p>
<pre><code class="language-cpp">matrix c = a*b;
</code></pre>
<p>Warum wird hier kein Copy-Constructor aufgerufen? Hier mal ein Beispielcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class dummy
{
	public:
		dummy()
		{
			cout &lt;&lt; &quot;Default-Constructor&quot; &lt;&lt; endl;
		};
		dummy( const dummy&amp; other )
		{
			cout &lt;&lt; &quot;Copy-Constructor&quot; &lt;&lt; endl;
                        //mache deep copy
		};
		dummy operator*( const dummy &amp; other )
		{
			//code
			cout &lt;&lt; &quot;Operator*&quot; &lt;&lt; endl;
			dummy tmp; //lokales Obj für Matrixmultiplikation
                        // mache multiplikation
			return tmp;
		};
		dummy&amp; operator=(const dummy&amp; other)
		{
			cout &lt;&lt; &quot;Operator=&quot; &lt;&lt; endl;

                        //erstelle deep-copy etc.

			return *this;
		};
};

int main()
{
	dummy a;
	dummy b;
	dummy c = a * b;
	return 0;
}
</code></pre>
<p>Die Ausgabe ist num folgende:</p>
<pre><code>Default-Constructor
Default-Constructor
Operator*
Default-Constructor
</code></pre>
<p>Erwarten würde ich aber eher</p>
<pre><code>Default-Constructor
Default-Constructor
Operator*
Default-Constructor
[b]Copy-Constructor[/b]
</code></pre>
<p>Kann mir jemand erklären, warum der Copy-Construktor nicht verwendet wird, um <strong>c</strong> zu initialisieren, bzw. wie wird <strong>c</strong> sonst initialisiert?</p>
<p>Vielen Dank!<br />
miho</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/175128/copy-constructor-und-operator</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 02:10:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/175128.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 07 Mar 2007 13:29:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 13:29:12 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Ich habe eine Frage bezüglich Copy-Konstruktor und dem Operator*. Ich mache gerade ein Softwarepraktikum an der Uni und soll dort Datentypen entwerfen. Ich habe aber leider ein Problem mit dem CoyConstructor. Wenn ich ein Objekt folgendermaßen initialisiere:</p>
<pre><code class="language-cpp">matrix c = a*b;
</code></pre>
<p>Warum wird hier kein Copy-Constructor aufgerufen? Hier mal ein Beispielcode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class dummy
{
	public:
		dummy()
		{
			cout &lt;&lt; &quot;Default-Constructor&quot; &lt;&lt; endl;
		};
		dummy( const dummy&amp; other )
		{
			cout &lt;&lt; &quot;Copy-Constructor&quot; &lt;&lt; endl;
                        //mache deep copy
		};
		dummy operator*( const dummy &amp; other )
		{
			//code
			cout &lt;&lt; &quot;Operator*&quot; &lt;&lt; endl;
			dummy tmp; //lokales Obj für Matrixmultiplikation
                        // mache multiplikation
			return tmp;
		};
		dummy&amp; operator=(const dummy&amp; other)
		{
			cout &lt;&lt; &quot;Operator=&quot; &lt;&lt; endl;

                        //erstelle deep-copy etc.

			return *this;
		};
};

int main()
{
	dummy a;
	dummy b;
	dummy c = a * b;
	return 0;
}
</code></pre>
<p>Die Ausgabe ist num folgende:</p>
<pre><code>Default-Constructor
Default-Constructor
Operator*
Default-Constructor
</code></pre>
<p>Erwarten würde ich aber eher</p>
<pre><code>Default-Constructor
Default-Constructor
Operator*
Default-Constructor
[b]Copy-Constructor[/b]
</code></pre>
<p>Kann mir jemand erklären, warum der Copy-Construktor nicht verwendet wird, um <strong>c</strong> zu initialisieren, bzw. wie wird <strong>c</strong> sonst initialisiert?</p>
<p>Vielen Dank!<br />
miho</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1240933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1240933</guid><dc:creator><![CDATA[miho]]></dc:creator><pubDate>Wed, 07 Mar 2007 13:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 13:36:00 GMT]]></title><description><![CDATA[<p>Ich würde mal auf Optimierungen des Compilers tippen (was bedeutet, daß 'tmp' gar nicht angelegt, sondern das &quot;Produkt&quot; direkt in c reinkonstruiert wird).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1240939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1240939</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 07 Mar 2007 13:36:00 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 13:39:38 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort. Ich habe Optimierung komplett ausgeschaltet, da ich auch den Verdacht hatte. Aber es hat nichts gebracht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> Kann man vielleicht den CopyConstruktor irgendwie erzwingen?</p>
<p>Gruß,<br />
miho</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1240943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1240943</guid><dc:creator><![CDATA[miho]]></dc:creator><pubDate>Wed, 07 Mar 2007 13:39:38 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 14:52:13 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich weiß zwar auch noch nicht, warum, aber wenn der operator*() eine const&amp; zurückliefert, funktioniert's wie erwartet... (gcc)<br />
Hat vielleicht irgendwas mit &quot;temporären Objekten&quot; und/oder RVO zu tun ...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241009</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 07 Mar 2007 14:52:13 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 14:59:39 GMT]]></title><description><![CDATA[<p>meine vermutung: du machst folgendes</p>
<pre><code class="language-cpp">dummy a;
    dummy b;
    dummy c = dummy();
</code></pre>
<p>was auch</p>
<pre><code class="language-cpp">dummy a;
    dummy b;
    dummy c();
</code></pre>
<p>ist, zwischendurch wird der *operator aufgerufen, aber der ist ohne jegliches belangen fuer den rest. fuehre mal ne neutzliche operation im operator durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241016</guid><dc:creator><![CDATA[rapso]]></dc:creator><pubDate>Wed, 07 Mar 2007 14:59:39 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 15:21:55 GMT]]></title><description><![CDATA[<p>rapso schrieb:</p>
<blockquote>
<p>meine vermutung: du machst folgendes</p>
<pre><code class="language-cpp">dummy a;
    dummy b;
    dummy c = dummy();
</code></pre>
<p>was auch</p>
<pre><code class="language-cpp">dummy a;
    dummy b;
    dummy c();
</code></pre>
<p>ist, zwischendurch wird der *operator aufgerufen, aber der ist ohne jegliches belangen fuer den rest. fuehre mal ne neutzliche operation im operator durch.</p>
</blockquote>
<p>Aber warum wird der CopyCtor genutzt, wenn operator*() eine &quot;dummy const&amp;&quot; zurückgibt ?</p>
<p>*in-den-wald-ruf*: CAAAAAAAMPER !!! Wir brauchen Dich hier ? <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>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241038</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241038</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:21:55 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 15:29:50 GMT]]></title><description><![CDATA[<p>Weil er nicht gerufen wird?</p>
<pre><code>int main() 
 { 
     dummy a; 
     dummy b; 
     dummy c( a * b);
     return 0; 
 }
</code></pre>
<p>MfG Kimmi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241049</guid><dc:creator><![CDATA[kimmi]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 15:34:46 GMT]]></title><description><![CDATA[<p>eine classe mit einem konstruktor z.b. myclass(int)</p>
<p>kann entweder mit<br />
myclass a(5)<br />
oder<br />
myclass a = 5 aufgerufen,</p>
<p>darum wird der nicht aufgerufen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241055</guid><dc:creator><![CDATA[Stelfer]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:34:46 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 15:35:47 GMT]]></title><description><![CDATA[<p>kimmi schrieb:</p>
<blockquote>
<p>Weil er nicht gerufen wird?</p>
<pre><code>int main() 
 { 
     dummy a; 
     dummy b; 
     dummy c( a * b);
     return 0; 
 }
</code></pre>
<p>MfG Kimmi</p>
</blockquote>
<p>Und wo ist der Unterschied zu</p>
<pre><code class="language-cpp">int main() 
 { 
     dummy a; 
     dummy b; 
     dummy tmp;
     tmp = ( a * b);
     dummy c = tmp;
     return 0; 
 }
</code></pre>
<p>... wo dann der CopyCtor auferufen wird ? Macht es soviel aus, wenn operator*() ein temporäres Objekt erzeugt ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241056</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:35:47 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 15:48:19 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Aber warum wird der CopyCtor genutzt, wenn operator*() eine &quot;dummy const&amp;&quot; zurückgibt ?</p>
</blockquote>
<p>Denk mal über</p>
<pre><code class="language-cpp">typedef const dummy const_dummy;
int main()
{
    dummy x = dummy();
    dummy y = const_dummy();
}
</code></pre>
<p>nach hinsichtlich der Voraussetzungen für die Auslassung des CopyOps.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241070</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 07 Mar 2007 15:48:19 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 21:06:16 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>...der Voraussetzungen für die Auslassung des CopyOps.</p>
</blockquote>
<p>Leider kenne ich nicht &quot;die Voraussetzungen für die Auslassung des CopyOps&quot;...</p>
<p>... und warum der CopyCtor ausgelassen wird, weiß ich auch nicht.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241291</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 07 Mar 2007 21:06:16 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Wed, 07 Mar 2007 22:08:51 GMT]]></title><description><![CDATA[<p>Für mich riecht das ganz klar nach RVO. Eigentlich sollte ein Compiler bei dem Code mit ausgeschalteten Optimierungen einen Aufruf des copy-ctor erzeugen, aber egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241321</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 07 Mar 2007 22:08:51 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 08:31:27 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>...aber egal.</p>
</blockquote>
<p>Finde ich jetzt nicht .... immerhin schien camper eine Lösung zu haben (die er leider noch nicht aufgedeckt hat).<br />
Außerdem sollte RVO doch Seiteneffekte erkennen/berücksichtigen .. das tut sie aber im vorliegenden Fall nicht (habe mal spaßeshalber einen CopyCtor mit Seiteneffekt gebastelt und der wird auch nicht aufgerufen).<br />
Und schließlich ist es IMO kein sooo exotischer Fall, dass man sowieso nicht in diese Falle tappen könnte.</p>
<p>Wäre schon schön, wenn hier klar würde, wo der (Denk-)fehler liegt.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241430</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241430</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 08 Mar 2007 08:31:27 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 08:53:33 GMT]]></title><description><![CDATA[<p>Ich nehme an RVO ist eine selbstverständliche Optimierung und keine, die man je nach Bedarf einschalten können soll (wäre imo auch logisch gesehen gut).</p>
<p>Was das Beispiel angeht, hat Simon2 ja schon gemutmaßt, dass es sich um RVO handelt. Hier wird das Objekt tmp (welches im operator* erzeugt und zurückgegeben wird) direkt in c hineinkonstruiert, es wird also kein Copy-Ctor benötigt.</p>
<pre><code class="language-cpp">Dummy c = a*b; // äquivalent zu
Dummy c( a*b ); // äquivalent zu
Dummy c( a.operator*( b ) );

// Pseudocode für operator*
Dummy operator*( Dummy const&amp; left, Dummy const&amp; right ) 
    returns: Dummy tmp;
{
}

// Ablauf nach RVO:
Dummy c; 
operator*( c, a, b );
void operator*( Dummy&amp; target, Dummy const&amp; left, Dummy const&amp; right )
{
}
</code></pre>
<p>Dummy &quot;c&quot; <strong>ist</strong> also Dummy &quot;tmp&quot;, weshalb nirgendwo etwas kopiert werden muss.</p>
<p>Bei der Rückgabe einer (konstanten) Referenz hingegen sollte klar sein, dass die Möglichkeit nicht besteht, die Initialisierung des Objekts in den Operator zu verlegen, da eine Rückgabe einer Referenz auf ein lokales Objekt undefiniert wäre. Demnach muss das zurückgegebene Objekt ausserhalb der Funktion existieren (this-Objekt, global, jedoch nicht im Aufrufer, es seidenn der Operator gibt einen der Operanden zurück ...), wodurch dessen Konstruktion nicht von der Funktion in den Aufrufer verlegt werden kann, wodurch eine Kopie erforderlich wird.</p>
<pre><code class="language-cpp">Dummy c( a*b ); // Kopie erforderlich
Dummy const&amp; operator*( Dummy const&amp; left, Dummy const&amp; right )
{
    return somethingNotLocal;
}
</code></pre>
<p>PS: Dieser Beitrag dient auch für mich selbst dazu, die Zusammenhänge auseinanderzuklamüsern. Sollte hier erwiesenermassen Quatsch stehen würde ich Euch (camper) bitten, das möglichst klarzustellen <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/1241447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241447</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 08 Mar 2007 08:53:33 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 09:40:01 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>mir scheint's auch immer mehr RVO zu sein...</p>
<p>allerdings bin ich ein wenig beunruhigt, weil es mein Verständnis von der Konstruierei doch ein wenig durcheinanderwirbelt.</p>
<p>Letztlich bleibt:</p>
<pre><code class="language-cpp">dummy f() { ... };

int main() {
   dummy a = f();
...
</code></pre>
<p>In dem Fall bestimmt nicht &quot;der Erzeuger von a&quot;, welcher Konstruktor aufgerufen wird (der evtl. erwartete CopyCtor), sondern der Implementierer von f().<br />
Das beschränkt ein wenig die Möglichkeiten des dummy-Entwicklers, weil hier RVO wohl letztlich von einer &quot;Standard-Copy-Konstruktion&quot; (also Objekte sind hinterher im Speicher identisch) ausgeht und irgendwelche exotischen Seiteneffekte (fällt mir gerade kein Beispiel ein; Referenzcounting würde sich daran ja nicht stören) nicht einbauen kann.<br />
Naja, immerhin kann er das Kopieren noch ganz verbieten ...</p>
<p>Hmmm strange....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241489</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 08 Mar 2007 09:40:01 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 09:39:54 GMT]]></title><description><![CDATA[<p>Sieh es doch mal so.Die Compiler sind jetzt so intelligent, dass sie Dinge optimieren an die du nie denken würdest, egal ob du das so willst oder nicht. <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="🙂"
    /><br />
Ich hatte den Test auch gemacht und mich schon gewundert, das der g++ im debugmodus den CopyCTor rausoptimiert. Sobald im Operator* etwas vernünftiges stand war er aber wieder drin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241492</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 08 Mar 2007 09:39:54 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 09:44:40 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>was war denn &quot;etwas Vernünftiges&quot; ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241501</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 08 Mar 2007 09:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 09:47:01 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">dummy operator*( const dummy &amp; other )
{
    //code
    cout &lt;&lt; &quot;Operator*&quot; &lt;&lt; endl;
    dummy tmp(other); //lokales Obj für Matrixmultiplikation
                // mache multiplikation
    return tmp;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1241506</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241506</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 08 Mar 2007 09:47:01 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 09:59:03 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<pre><code class="language-cpp">dummy operator*( const dummy &amp; other )
{
    //code
    cout &lt;&lt; &quot;Operator*&quot; &lt;&lt; endl;
    dummy tmp(other); //lokales Obj für Matrixmultiplikation
                // mache multiplikation
    return tmp;
};
</code></pre>
</blockquote>
<p>Naja, den CopyCtor explizit aufrufen, kann ja jeder.... <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="😉"
    /><br />
... und RVO findet ja trotzdem statt.</p>
<p>Mein &quot;Vernünftiges&quot; sah nämlich so aus:</p>
<pre><code class="language-cpp">class dummy {
   int i;
// ...
};

dummy operator*( const dummy &amp; other )
{
    //code
    cout &lt;&lt; &quot;Operator*&quot; &lt;&lt; endl;
    dummy tmp;
    tmp.i = i * other.i;
    return tmp;
};
</code></pre>
<p>.... und da wird KEIN CopyCtor aufgerufen, obwohl es mir als sehr <em>vernünftige</em> Implementation dieses operators erschien... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241522</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 08 Mar 2007 09:59:03 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 10:19:02 GMT]]></title><description><![CDATA[<p>Das sehe ich auch so. ....... jetzt! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Obwohl die Verwendung des CopyCtor hier den weiteren Aufruf eines Default-Konstrukltors bedingen würde (für das temporäre Objekt). Sonst gäbe es ja nichts zum kopieren. Und genau das scheint der Compiler ja wegzuoptimieren.<br />
Ich gebe zu, der direkte Aufruf des CopyCTor war kein so gutes Beispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241540</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 08 Mar 2007 10:19:02 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 16:43:29 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Außerdem sollte RVO doch Seiteneffekte erkennen/berücksichtigen ..</p>
</blockquote>
<p>Wäre mir neu. Wie kommst du darauf?<br />
RVO ist nur eine der ganzen Stellen wo der Programmierer nicht genau wissen kann wo bzw. wie oft seine Objekte rumkopiert werden...</p>
<p>Ein Copy-Ctor muss - damit eine Klasse in C++ sinnvoll einsetzbar ist - immer so geschrieben sein dass</p>
<pre><code class="language-cpp">Foo a = x;
</code></pre>
<p>zu</p>
<pre><code class="language-cpp">Foo tmp = x;
Foo a = tmp;
</code></pre>
<p>äquivalent ist -- also was x und a angeht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241777</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241777</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 08 Mar 2007 16:43:29 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 17:06:04 GMT]]></title><description><![CDATA[<p>Also ich verwende <a href="http://VS2005.NET" rel="nofollow">VS2005.NET</a> Standardedition.<br />
Und wenn ich</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 

using namespace std; 

class dummy 
{ 
    public: 
        dummy() 
        { 
            cout &lt;&lt; &quot;Default-Constructor&quot; &lt;&lt; endl; 
        }; 
        dummy( const dummy&amp; other ) 
        { 
            cout &lt;&lt; &quot;Copy-Constructor&quot; &lt;&lt; endl; 
                        //mache deep copy 
        }; 
        dummy operator*( const dummy &amp; other ) 
        { 
            //code 
            cout &lt;&lt; &quot;Operator*&quot; &lt;&lt; endl; 
            dummy tmp; //lokales Obj für Matrixmultiplikation 
                        // mache multiplikation 
            return tmp; 
        }; 
        dummy&amp; operator=(const dummy&amp; other) 
        { 
            cout &lt;&lt; &quot;Operator=&quot; &lt;&lt; endl; 

                        //erstelle deep-copy etc. 

            return *this; 
        }; 
}; 

int main() 
{ 
    dummy a; 
    dummy b; 
    dummy c = a * b; 
    return 0; 
}
</code></pre>
<p>mit den Standardeinstellungen compiliere, sieht die Ausgabe so aus:</p>
<blockquote>
<p>Default-Constructor<br />
Default-Constructor<br />
Operator*<br />
Default-Constructor<br />
<strong>Copy-Constructor</strong></p>
</blockquote>
<p>Also bei mir wird der Copykonstruktor demnach aufgerufen oO.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241798</guid><dc:creator><![CDATA[Kahino]]></dc:creator><pubDate>Thu, 08 Mar 2007 17:06:04 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Thu, 08 Mar 2007 18:56:01 GMT]]></title><description><![CDATA[<p>Kahino schrieb:</p>
<blockquote>
<p>Also ich verwende <a href="http://VS2005.NET" rel="nofollow">VS2005.NET</a> Standardedition.<br />
Und wenn ich [...] mit den Standardeinstellungen compiliere [wird bei mir] der Copykonstruktor ... aufgerufen oO.</p>
</blockquote>
<p>Hast Du im Debug- oder im Release-Modus kompiliert? Im Release-Modus ist der Standard für die Optimierungen in VS 2005 /O2, also Optimierung auf Geschwindigkeit. Bei Debug-Modus hingegen werden standardmäßig keine Optimierungen vorgenommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1241876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1241876</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Thu, 08 Mar 2007 18:56:01 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Fri, 09 Mar 2007 08:37:28 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Außerdem sollte RVO doch Seiteneffekte erkennen/berücksichtigen ..</p>
</blockquote>
<p>Wäre mir neu. Wie kommst du darauf?...</p>
</blockquote>
<p>Intuition. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>... aber offensichtlich eine falsche.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>...<br />
Ein Copy-Ctor muss - damit eine Klasse in C++ sinnvoll einsetzbar ist - immer so geschrieben sein dass</p>
<pre><code class="language-cpp">Foo a = x;
</code></pre>
<p>zu</p>
<pre><code class="language-cpp">Foo tmp = x;
Foo a = tmp;
</code></pre>
<p>äquivalent ist -- also was x und a angeht.</p>
</blockquote>
<p>Jupp, genau darauf sind wir hier (habe mit Arbeitskollegen eine zeitlang darüber diskutiert) inzwischen auch gekommen.</p>
<p>Letztlich hatte ich außerdem gedacht, dass RVO ein &quot;Sprachfeature&quot; sei und weniger eine &quot;abschaltbare Optimierungsoption&quot; ... .</p>
<p>Das war mir eben neu.</p>
<p>Danke,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1242111</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1242111</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 09 Mar 2007 08:37:28 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Fri, 09 Mar 2007 09:14:30 GMT]]></title><description><![CDATA[<p>Konrad Rudolph schrieb:</p>
<blockquote>
<p>Kahino schrieb:</p>
<blockquote>
<p>Also ich verwende <a href="http://VS2005.NET" rel="nofollow">VS2005.NET</a> Standardedition.<br />
Und wenn ich [...] mit den Standardeinstellungen compiliere [wird bei mir] der Copykonstruktor ... aufgerufen oO.</p>
</blockquote>
<p>Hast Du im Debug- oder im Release-Modus kompiliert? Im Release-Modus ist der Standard für die Optimierungen in VS 2005 /O2, also Optimierung auf Geschwindigkeit. Bei Debug-Modus hingegen werden standardmäßig keine Optimierungen vorgenommen.</p>
</blockquote>
<p>Ist das beim gcc eigentlich auch abschaltbar ?<br />
Noopt (-O0) habe ich eigentlich angeschaltet.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1242132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1242132</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 09 Mar 2007 09:14:30 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-Constructor und operator* on Fri, 09 Mar 2007 12:09:39 GMT]]></title><description><![CDATA[<p>RVO und allgemein die Auslassung des Copy-Ctors sind keine solchen Optimierungen, die man üblicherweise durch Compileroptionen beeinflussen kann. Bei letzteren geht es i.allg. um die Veränderungen von Parametern des Programmes, die durch den Standard nicht festgelegt werden (wie etwa die Dauer des Programmablaufs) oder jedenfalls weitgehend der Implementation vorbehalten sind (etwa das genaue Verhalten von Gleitkommaoperationen). Dem gegenüber verändert die Auslassung des Copy-Ctors das beobachtbare Verhalten i.S.d. Standards. Sie verändert also die <em>Interpretation</em> des Programmes. Es ist also tatsächlich - wenn man diese Einteilung wünscht - ein Merkmal der Sprache und keine Fähigkeit des Compilers an sich.</p>
<p>Was brauchen wir für die Auslassung des Copy-Ctors?<br />
Wenn der Copy-Ctor ausgelassen wird, so nimmt das zu initialisierende Objekt die Identität des initialisierenden Ausdrucks an, im Gegenzug wird letzterer nicht (vorzeitig) zerstört. Die semantische Veränderung des Programmes darf aber nur im Nichtausführen eben des Copy-Ctors bzw. Destruktors bestehen. D.h. kann man zu irgendeinem Zeitpunkt sowohl auf den initialisierenden Ausdurck als auch auf das zu initialisierende Objekt gleichzeitig zugreufen, dann müssen diese logisch getrennt - und eben nicht als identisch im Objekt - erscheinen, die Auslassung des Copy-Ctors ist dann folglich ausgeschlossen. Schlussfolgerung:<br />
Der initialisierende Ausdruck muss stets ein <em>temporäres Objekt</em> sein. Zudem - das dürfte ohnehin klar sein - müssen die dynamischen Typen abgesehen von cv-Qualifikation (soweit diese cv-Qualifikation die Aufrufbarkeit des Copy-Ctors nicht berührt) identisch sein. Damit sind Referenzen (als Initialisier) in doppelter Hinsicht ausgeschlossen: Einerseits sind es keine temporären Objekte, andererseits gibt es für die Übereinstimmung des dynamischen Typs keine Garantie. Sind diese beiden Bedingungen erfüllt:<br />
- temporäres Objekt<br />
- identischer Typ<br />
kann der Copy-Ctor überall dort ausgelassen werden, wo der Standard das vorsieht. RVO ist hier im Grunde nur ein Spezialfall. NRVO ist eine Erweiterung, dort ist der initialisierende Ausdruck zwar kein temporäres Objekt, würde aber nach dem Return-Statement ohnehin zerstört werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1242241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1242241</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 09 Mar 2007 12:09:39 GMT</pubDate></item></channel></rss>