<?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[Aufruf des Kopierkonstruktors]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgenden Code:</p>
<pre><code>#include&lt;iostream&gt;
#include&lt;string&gt;

using namespace std;

class Counter
{
      public:
             Counter();
             Counter(const Counter &amp;);
             ~Counter(){}
             int GetItsVal() const {return itsVal; }
             void SetItsVal(int x) { itsVal = x; }
             Counter operator++ ();
      private:
              int itsVal;
};

Counter::Counter():itsVal(0)
{};

Counter::Counter(const Counter &amp;rhs)
{
    cout&lt;&lt;&quot;Aufruf des Kopierkonstruktors\n&quot;;
}

Counter Counter::operator++()
{
        ++itsVal;
        Counter temp;
        temp.SetItsVal(itsVal);
        return temp;
};
/*
Counter funktionone(const Counter tmp)
{
        return tmp;
}
*/

Counter funktion()
{
        Counter tmp;
        tmp.SetItsVal(4);
        return tmp;
}

int main()
{   
    Counter test; 

    cout&lt;&lt;test.GetItsVal()&lt;&lt;endl;
    test.SetItsVal(5);
    cout&lt;&lt;test.GetItsVal()&lt;&lt;endl;

    Counter a = ++test;
    Counter b = funktionone(test);
    Counter c = funktion();

    cout&lt;&lt;test.GetItsVal()&lt;&lt;endl;

    getchar();    
    return 0;
}
</code></pre>
<p>Der Kopierkonstrukor wird bei diesem Programm nur bei Aufruf und bei der Zuweisung des Rückgabewertes von &quot;funktionone&quot; aufgerufen. Das verstehe ich auch. Aber warum wird der Kopierkonstrukor nicht bei der Zuweisung des Rückgabewertes von &quot;funktion&quot; aufgerufen? Schließlich gibt &quot;funktion&quot; doch auch ein Counter-Objekt zurück, welches dann &quot;a&quot; zugewiesen wird, was meiner Meinung nach soviel heißt wie, kopiere die Inhalte der Elementvariablen von dem zurückgegebenen Counter-Objekt in die Elementvariablen von &quot;a&quot;. Oder sehe ich das falsch?</p>
<p>Die gleiche Frage stelle ich mir bei der Definition von &quot;operator++()&quot;, da der doch auch ein Counter-Objekt zurückgibt.</p>
<p>Vielen Dank für die Antworten!</p>
<p>Gruß Pete</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/195937/aufruf-des-kopierkonstruktors</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 05:47:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195937.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Oct 2007 17:54:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Aufruf des Kopierkonstruktors on Tue, 23 Oct 2007 17:54:16 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgenden Code:</p>
<pre><code>#include&lt;iostream&gt;
#include&lt;string&gt;

using namespace std;

class Counter
{
      public:
             Counter();
             Counter(const Counter &amp;);
             ~Counter(){}
             int GetItsVal() const {return itsVal; }
             void SetItsVal(int x) { itsVal = x; }
             Counter operator++ ();
      private:
              int itsVal;
};

Counter::Counter():itsVal(0)
{};

Counter::Counter(const Counter &amp;rhs)
{
    cout&lt;&lt;&quot;Aufruf des Kopierkonstruktors\n&quot;;
}

Counter Counter::operator++()
{
        ++itsVal;
        Counter temp;
        temp.SetItsVal(itsVal);
        return temp;
};
/*
Counter funktionone(const Counter tmp)
{
        return tmp;
}
*/

Counter funktion()
{
        Counter tmp;
        tmp.SetItsVal(4);
        return tmp;
}

int main()
{   
    Counter test; 

    cout&lt;&lt;test.GetItsVal()&lt;&lt;endl;
    test.SetItsVal(5);
    cout&lt;&lt;test.GetItsVal()&lt;&lt;endl;

    Counter a = ++test;
    Counter b = funktionone(test);
    Counter c = funktion();

    cout&lt;&lt;test.GetItsVal()&lt;&lt;endl;

    getchar();    
    return 0;
}
</code></pre>
<p>Der Kopierkonstrukor wird bei diesem Programm nur bei Aufruf und bei der Zuweisung des Rückgabewertes von &quot;funktionone&quot; aufgerufen. Das verstehe ich auch. Aber warum wird der Kopierkonstrukor nicht bei der Zuweisung des Rückgabewertes von &quot;funktion&quot; aufgerufen? Schließlich gibt &quot;funktion&quot; doch auch ein Counter-Objekt zurück, welches dann &quot;a&quot; zugewiesen wird, was meiner Meinung nach soviel heißt wie, kopiere die Inhalte der Elementvariablen von dem zurückgegebenen Counter-Objekt in die Elementvariablen von &quot;a&quot;. Oder sehe ich das falsch?</p>
<p>Die gleiche Frage stelle ich mir bei der Definition von &quot;operator++()&quot;, da der doch auch ein Counter-Objekt zurückgibt.</p>
<p>Vielen Dank für die Antworten!</p>
<p>Gruß Pete</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390737</guid><dc:creator><![CDATA[Pete34]]></dc:creator><pubDate>Tue, 23 Oct 2007 17:54:16 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf des Kopierkonstruktors on Tue, 23 Oct 2007 18:15:19 GMT]]></title><description><![CDATA[<p>Probier auch mal <code>Counter c( funktion() );</code> , gehts da?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390743</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Tue, 23 Oct 2007 18:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf des Kopierkonstruktors on Tue, 23 Oct 2007 18:17:17 GMT]]></title><description><![CDATA[<p>In (Zeile 57) wird der Copy-Constructor aufgerufen, da test kopiert wird (call-by-value in (35)). Wenn du in (37) eine Ausgabe machst, siehst du es.<br />
Für Zuweisungen wird immer Counter&amp; operator=(const Counter&amp;) aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390744</guid><dc:creator><![CDATA[deha]]></dc:creator><pubDate>Tue, 23 Oct 2007 18:17:17 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf des Kopierkonstruktors on Tue, 23 Oct 2007 18:26:22 GMT]]></title><description><![CDATA[<p>Definiere in deiner Counter-Klasse</p>
<p>a) den Default-Konstruktor: Counter()<br />
b) den Kopierkonstruktor: Counter(const Counter&amp;)<br />
c) den Destruktor: ~Counter()<br />
und<br />
d) den Zuweisungsoperator: Counter&amp; operator=(const Counter&amp;);</p>
<p>und versehe sie mit Ausgabefunktionen. Dann wird einem so manches klarer.</p>
<p>Ich habe mir schon so einige seg-faults eingefangen, weil ich in meinen Klassen Pointerverwaltung und Speicherfreigabe ganz elegant lösen wollte und mir beim Kopieren und Zuweisen die Objekte &quot;zerschossen&quot; wurden <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>Grüße... Heiko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390754</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Tue, 23 Oct 2007 18:26:22 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf des Kopierkonstruktors on Tue, 23 Oct 2007 18:28:16 GMT]]></title><description><![CDATA[<p>Habe ich gemacht.<br />
Aber auch dann wird der Kopierkonstruktor nicht aufgerufen.</p>
<p>Ich habe das Gefühl, dass das etwas damit zu tun hat, dass das Counter-Objekt &quot;tmp&quot; welches in der Funktion &quot;funktion&quot; erstellt wird nach Beendigung der Funktion nicht mehr existiert, aber die Elementvariable &quot;itsVal&quot; des Counter-Objekts &quot;c&quot; hat danach ja den Wert 4, somit muss diese ja vom dem Objekt &quot;tmp&quot; kopiert worden sein nur wird kein Kopierkonstruktor aufgerufen, was ich nicht verstehe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390756</guid><dc:creator><![CDATA[Pete34]]></dc:creator><pubDate>Tue, 23 Oct 2007 18:28:16 GMT</pubDate></item><item><title><![CDATA[Reply to Aufruf des Kopierkonstruktors on Tue, 23 Oct 2007 18:32:54 GMT]]></title><description><![CDATA[<p>ok mit dem Zuweisungsoperator habe ich mich noch nicht beschäftigt. Das werde ich dann erstmal tun.</p>
<p>Vielen Dank!</p>
<p>Gruß Pete</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1390761</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1390761</guid><dc:creator><![CDATA[Pete34]]></dc:creator><pubDate>Tue, 23 Oct 2007 18:32:54 GMT</pubDate></item></channel></rss>