<?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[Kopierkonstruktor Call by Value]]></title><description><![CDATA[<p>Hallo,<br />
wenn ich ein Objekt per all by Value an eine Funktion übergebe wird ja ein Temporäres Objekt erzeugt. Das ist ja soweit logisch. Aber wieso wird er hier ein 2. Mal aufgerufen:</p>
<pre><code class="language-cpp">func(x)
</code></pre>
<p>der Return wert wird ja verworfen.</p>
<p>hier ist es wieder klar:</p>
<pre><code class="language-cpp">klasse y=func(x)
</code></pre>
<p>hier schon wieder nicht:</p>
<pre><code class="language-cpp">y=func(x)
</code></pre>
<p>ich hoffe mir kann geholfen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262763/kopierkonstruktor-call-by-value</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 11:13:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262763.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Mar 2010 23:29:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kopierkonstruktor Call by Value on Wed, 10 Mar 2010 23:29:29 GMT]]></title><description><![CDATA[<p>Hallo,<br />
wenn ich ein Objekt per all by Value an eine Funktion übergebe wird ja ein Temporäres Objekt erzeugt. Das ist ja soweit logisch. Aber wieso wird er hier ein 2. Mal aufgerufen:</p>
<pre><code class="language-cpp">func(x)
</code></pre>
<p>der Return wert wird ja verworfen.</p>
<p>hier ist es wieder klar:</p>
<pre><code class="language-cpp">klasse y=func(x)
</code></pre>
<p>hier schon wieder nicht:</p>
<pre><code class="language-cpp">y=func(x)
</code></pre>
<p>ich hoffe mir kann geholfen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867260</guid><dc:creator><![CDATA[Paule S]]></dc:creator><pubDate>Wed, 10 Mar 2010 23:29:29 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor Call by Value on Wed, 10 Mar 2010 23:34:04 GMT]]></title><description><![CDATA[<p>Paule S schrieb:</p>
<blockquote>
<p>Hallo,<br />
wenn ich ein Objekt per all by Value an eine Funktion übergebe wird ja ein Temporäres Objekt erzeugt. Das ist ja soweit logisch. Aber wieso [...]</p>
</blockquote>
<p>Kann man nicht beantworten. Du hast zu wenig Informationen gegeben. Gib mal komplette Beispiele und nicht nur so kleine Code-Fetzen an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867262</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867262</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 10 Mar 2010 23:34:04 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor Call by Value on Wed, 10 Mar 2010 23:37:05 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">klasse func(klasse test) {return test;}
</code></pre>
<p>Kopierkonstruktor:</p>
<pre><code class="language-cpp">klasse(const klasse&amp; o): y(o.x), x(o.y) {
		cout &lt;&lt; &quot;Copy&quot; &lt;&lt; endl;
	}
</code></pre>
<p>Oder was brauchst du noch? Die klasse hat nur die 2 int variablen x und y.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867263</guid><dc:creator><![CDATA[Paule S]]></dc:creator><pubDate>Wed, 10 Mar 2010 23:37:05 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor Call by Value on Wed, 10 Mar 2010 23:38:51 GMT]]></title><description><![CDATA[<p>Das ist arg karg, die Info die du uns gibst.<br />
Sind die beiden Methoden identisch?</p>
<pre><code class="language-cpp">func(x);
klasse y = func(x);
</code></pre>
<p>Kannst du da mal mehr Infos rausrücken, am besten ein Beispiel wo alle Funktionen und Typen bekannt sind.</p>
<p>// edit: Nachdem ich zu langsam war:<br />
Das Statement &quot;return&quot; kopiert das Objekt in jedem Fall nochmal für die Rückgabe, egal ob du den Wert verwirfst oder verwendest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867264</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 10 Mar 2010 23:38:51 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor Call by Value on Wed, 10 Mar 2010 23:55:18 GMT]]></title><description><![CDATA[<p>Paule S schrieb:</p>
<blockquote>
<pre><code class="language-cpp">klasse func(klasse test) {return test;}
</code></pre>
<p>Kopierkonstruktor:</p>
<pre><code class="language-cpp">klasse(const klasse&amp; o): y(o.x), x(o.y) {
		cout &lt;&lt; &quot;Copy&quot; &lt;&lt; endl;
	}
</code></pre>
<p>Oder was brauchst du noch? Die klasse hat nur die 2 int variablen x und y.</p>
</blockquote>
<p>Ich tue jetzt einfach mal so, als wenn Deine main so aussehen würde:</p>
<pre><code class="language-cpp">int main() {
  Klasse x;
  cout &lt;&lt; &quot;-----\n&quot;;
  func(x);                 // 1
  cout &lt;&lt; &quot;-----\n&quot;;
  Klasse y = func(x);      // 2
  cout &lt;&lt; &quot;-----\n&quot;;
  y = func(x);             // 3
}
</code></pre>
<p>Bei mein Compiler (GCC) kommt dabei folgendes raus:<br />
1. 2mal copy ctor<br />
2. 2mal copy ctor<br />
3. 2mal copy ctor und 1mal operator= anwenden</p>
<p>Das ist jeweils eine Kopie x--&gt;test und eine Kopie für test--&gt;return_wert. Der C++ Standard erlaubt unter gewissen Umständen das &quot;Verschmelzen&quot; von Quell- und Ziel-Objekt, weil damit unnötige Kopien vermieden werden können (engl: &quot;copy elision&quot;). In diesem Fall erlaubt der C++ Standard das Verschmelzen von &quot;test&quot; und dem Return-Wert. Das kann aber kein Compiler und daher bekommst Du immer zwei Kopien hier, statt einer.</p>
<p>Es gibt noch einen anderen netten Fall:</p>
<pre><code class="language-cpp">func(Klasse(42));
</code></pre>
<p>...ein entsprechender Konstruktor vorausgesetzt. Hier sollte ein guter Compiler das Programm so übersetzen, dass der copy ctor nur höchstens einmal aufgerufen wird (nämlich zur Kopie von test -&gt; Return-Wert). Das temporäre Objekt Klasse(42) darf und mit &quot;test&quot; &quot;verschmolzen&quot; werden.</p>
<p>Weiteres Stichwort aus dem Bereich &quot;copy elision&quot;: &quot;return value optimization&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867272</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 10 Mar 2010 23:55:18 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor Call by Value on Thu, 11 Mar 2010 01:02:54 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Bei meinem Compiler (GCC) kommt dabei folgendes raus:<br />
1. 2mal copy ctor<br />
2. 2mal copy ctor<br />
3. 2mal copy ctor und 1mal operator= anwenden</p>
<p>Das ist jeweils eine Kopie x--&gt;test und eine Kopie für test--&gt;return_wert. Der C++ Standard erlaubt unter gewissen Umständen das &quot;Verschmelzen&quot; von Quell- und Ziel-Objekt, weil damit unnötige Kopien vermieden werden können (engl: &quot;copy elision&quot;). In diesem Fall erlaubt der C++ Standard das Verschmelzen von &quot;test&quot; und dem Return-Wert. Das kann aber kein Compiler und daher bekommst Du immer zwei Kopien hier, statt einer.</p>
</blockquote>
<p>Ich vergaß zu erwähnen, dass im zweiten Fall</p>
<pre><code class="language-cpp">Klasse y = func(x);
</code></pre>
<p>Dein Compiler anscheinend auch den Return-Wert der Funktion mit y &quot;verschmelzt&quot;. Sonst würdest Du sogar mehr als zwei Copy-Ctor-Aufrufe beobachten. Das kann man u.a. <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1905.pdf" rel="nofollow">hier</a> nachlesen, siehe §12.8/15.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867283</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 11 Mar 2010 01:02:54 GMT</pubDate></item><item><title><![CDATA[Reply to Kopierkonstruktor Call by Value on Thu, 11 Mar 2010 03:18:40 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/38414">@Paule</a> S:<br />
Der Debugger ist dein Freund.<br />
Beispiel basteln, Haltepunkt in den copy-ctor, &quot;go&quot; drücken, und gucken wo der copy-ctor aufgerufen wird.<br />
Eigentlich ganz einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1867293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1867293</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 11 Mar 2010 03:18:40 GMT</pubDate></item></channel></rss>