<?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[Lebenszyklus Initlist vs Konstukturbody]]></title><description><![CDATA[<p>Mich beschäftigt gerade eine Frage, in der es um zwei Varianten der Objekt-Lebenszyklen geht.</p>
<p>Wenn ich hier von Variante 1 oder 2 schreibe, dann bedeutet dies, dass ich immer nur eine von beiden Zeilen meine und die andere dann automatisch nicht vorhanden ist.</p>
<p>Wenn ich in der Klasse B ein Objekt auf Variante 1 erzeugen, dann wird vor dem Konstruktor-Body von B der Konstruktor von A aufgerufen. Es wird also schon ein Objekt von A erzeugt, bevor der Scope des Konstruktors von B abgearbeitet wird. Dann wird zusätzlich im Konstruktor-Body nochmal ein Konstuktor von A aufgerufen und gleich wieder zerstört, wenn der Konstruktor fertig ist, ist das richtig so?</p>
<p>Das alte Objekt was vorher in _a war, existiert aber weiterhin und wird er beim Zerstören von B dann auch endgültig zerstört, oder?</p>
<pre><code>class B
{
private:
    A _a;

public:
    B()
        : _a( A() ) // Variante 2
    {
        _a = A();   // Variante 1 
    }
};
</code></pre>
<p>Wähle ich stattdessen Variante 2, dann übernehme ich selbst das Erzeugen von _a und es gibt nur ein Objekt A und nicht zwei wie bei Variante 1, ist dem so?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321807/lebenszyklus-initlist-vs-konstukturbody</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 21:47:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321807.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Nov 2013 06:35:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lebenszyklus Initlist vs Konstukturbody on Mon, 25 Nov 2013 06:35:35 GMT]]></title><description><![CDATA[<p>Mich beschäftigt gerade eine Frage, in der es um zwei Varianten der Objekt-Lebenszyklen geht.</p>
<p>Wenn ich hier von Variante 1 oder 2 schreibe, dann bedeutet dies, dass ich immer nur eine von beiden Zeilen meine und die andere dann automatisch nicht vorhanden ist.</p>
<p>Wenn ich in der Klasse B ein Objekt auf Variante 1 erzeugen, dann wird vor dem Konstruktor-Body von B der Konstruktor von A aufgerufen. Es wird also schon ein Objekt von A erzeugt, bevor der Scope des Konstruktors von B abgearbeitet wird. Dann wird zusätzlich im Konstruktor-Body nochmal ein Konstuktor von A aufgerufen und gleich wieder zerstört, wenn der Konstruktor fertig ist, ist das richtig so?</p>
<p>Das alte Objekt was vorher in _a war, existiert aber weiterhin und wird er beim Zerstören von B dann auch endgültig zerstört, oder?</p>
<pre><code>class B
{
private:
    A _a;

public:
    B()
        : _a( A() ) // Variante 2
    {
        _a = A();   // Variante 1 
    }
};
</code></pre>
<p>Wähle ich stattdessen Variante 2, dann übernehme ich selbst das Erzeugen von _a und es gibt nur ein Objekt A und nicht zwei wie bei Variante 1, ist dem so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367714</guid><dc:creator><![CDATA[_CppNeuland]]></dc:creator><pubDate>Mon, 25 Nov 2013 06:35:35 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszyklus Initlist vs Konstukturbody on Mon, 25 Nov 2013 08:51:16 GMT]]></title><description><![CDATA[<p>_CppNeuland schrieb:</p>
<blockquote>
<p>Wenn ich in der Klasse B ein Objekt auf Variante 1 erzeugen, dann wird vor dem Konstruktor-Body von B der Konstruktor von A aufgerufen. Es wird also schon ein Objekt von A erzeugt, bevor der Scope des Konstruktors von B abgearbeitet wird. Dann wird zusätzlich im Konstruktor-Body nochmal ein Konstuktor von A aufgerufen und gleich wieder zerstört, wenn der Konstruktor fertig ist, ist das richtig so?</p>
</blockquote>
<p>Das letzte Objekt wird zerstört, wenn der Ausdruck fertig ist, in dem es auftaucht. So wie alle temporären Objekte.</p>
<blockquote>
<p>Das alte Objekt was vorher in _a war, existiert aber weiterhin und wird er beim Zerstören von B dann auch endgültig zerstört, oder?</p>
</blockquote>
<p>Vor was? Vor der Zuweisung? Die Zuweisung ändert doch keine Objektidentität. Das ist immer noch das gleiche _a. In _a ist kein Objekt, _a ist das Objekt. Es wurden ihm neue Werte zugewiesen.</p>
<blockquote>
<p>Wähle ich stattdessen Variante 2, dann übernehme ich selbst das Erzeugen von _a und es gibt nur ein Objekt A und nicht zwei wie bei Variante 1, ist dem so?</p>
</blockquote>
<p>Du erzeugst hier ebenfalls ein unnötiges temporäres Objekt, bloß ein bisschen früher und eventuell leichter wegoptimierbar.</p>
<p>P.S.: Das sind nur Fragen zur Erweiterung deines Wissens, oder? Du weißt, wie du Initialisierungslisten richtig benutzt, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367742</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 25 Nov 2013 08:51:16 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszyklus Initlist vs Konstukturbody on Mon, 25 Nov 2013 09:16:17 GMT]]></title><description><![CDATA[<p>Naja, wenn immer wenn ich denke ich habe was verstanden, werde ich doch eines besseren belehrt und muss noch mal zu den Grundlagen zurück.</p>
<p>Bei Variente 1 ist mir halt aufgefallen dass ich zweimal einen Konstruktor von A aufrufe(einmal bei der Initialisierung des Members _a und einmal im Konstruktorrumpf) und folge dessen auch zweimal den Destruktor.</p>
<p>Bei der Variante 2 mit der Initialisiserungsliste habe ich nur einen Konstruktor- und Destruktor-Aufruf von A und daher dachte ich mir, dass diese Erzeugung von A resourcenschonender ist.</p>
<p>Mein Ziel ist es halt in einem Objekt von Klasse B ein Objekt von Klasse A zu erzeugen(abhängig von Parametern) und für die Lebensdauer von B dieses auch aufrecht zu erhalten. Wenn ich Variante 1 wählen dann wird mir das Objekt, was ich in dem Rumpf erzeuge, ja auch gleich wieder zerstört, sobald der Konstruktor von B fertig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367749</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367749</guid><dc:creator><![CDATA[_CppNeuland]]></dc:creator><pubDate>Mon, 25 Nov 2013 09:16:17 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszyklus Initlist vs Konstukturbody on Mon, 25 Nov 2013 09:23:13 GMT]]></title><description><![CDATA[<p>_CppNeuland schrieb:</p>
<blockquote>
<p>Mein Ziel ist es halt in einem Objekt von Klasse B ein Objekt von Klasse A zu erzeugen(abhängig von Parametern) und für die Lebensdauer von B dieses auch aufrecht zu erhalten. Wenn ich Variante 1 wählen dann wird mir das Objekt, was ich in dem Rumpf erzeuge, ja auch gleich wieder zerstört, sobald der Konstruktor von B fertig ist.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Du meinst den Member _a?</p>
<p>Entweder habe ich gerade keine Ahnung was du meinst oder du verstehst das Objektmodell von C++ nicht. Daher nochmal die Frage: Wie würdest du die Klasse B &quot;normal&quot; schreiben? Doch wohl nicht wirklich mit einer dieser beiden Varianten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367750</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 25 Nov 2013 09:23:13 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszyklus Initlist vs Konstukturbody on Mon, 25 Nov 2013 09:33:51 GMT]]></title><description><![CDATA[<p>Ja das Objekt von A in der Klasse B soll der Member _a sein, um den dreht sich hier alles bei mir.</p>
<p>Die Frage wie ich die Klasse B schreiben will ich gerade hier erörtern. Das ist der Sinn und Zweck meiner Frage, da Klarheit rein zu bekommen.</p>
<p>Die dritte Möglichkeit die Klasse B zu schreiben wäre ein Zeiger auf A und dann per new ein Objekt von A zu erzeugen. Dann fällt mir noch eine Referenz auf A ein, die ich dann gleich in der Initlist mit einer Adresse belegen muss.</p>
<p>Mehr fällt mir nicht. Da ist mein erstes größeres C++-Programm, in Java und PHP stand ich vor solchen Problemen noch nie. Aber in C++ muss man sich schon viel mehr Gedanken machen wie was wo erzeugt, zerstört etc. wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367753</guid><dc:creator><![CDATA[_CppNeuland]]></dc:creator><pubDate>Mon, 25 Nov 2013 09:33:51 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszyklus Initlist vs Konstukturbody on Mon, 25 Nov 2013 09:43:23 GMT]]></title><description><![CDATA[<p>dir ist schon bewusst:</p>
<pre><code>class B
{
    A _a;
public:
    // standard-konstruktor -&gt; standardkonstruktor von this-&gt;_a wird aufgerufen
};
</code></pre>
<p>und</p>
<pre><code>class B
{
    A _a;
public:
    B()
    {
    }
    // konstruktor ohne explizite initialisierung von this-&gt;_a -&gt; standardkonstruktor von this-&gt;_a wird aufgerufen
};
</code></pre>
<p>oder?</p>
<p>deine beiden beispiele sind... naja, unnötig. wieso möchtest du den kopierkonstruktor mit einem standard-konstruierten rhs ausführen? (variante 2) und wieso möchtest du zuerst standard-konstruieren und dann ein standard-konstruiertes objekt zuweisen? (variante 1)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367755</guid><dc:creator><![CDATA[asdfsdf]]></dc:creator><pubDate>Mon, 25 Nov 2013 09:43:23 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszyklus Initlist vs Konstukturbody on Mon, 25 Nov 2013 09:54:23 GMT]]></title><description><![CDATA[<p>Ich möchte einmal A _a mit Parametern erzeugen, also ohne dessen Standardkonstruktor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367757</guid><dc:creator><![CDATA[_CppNeuland]]></dc:creator><pubDate>Mon, 25 Nov 2013 09:54:23 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszyklus Initlist vs Konstukturbody on Mon, 25 Nov 2013 09:58:56 GMT]]></title><description><![CDATA[<p>huh? aber in deinem eröffnungspost hast du den kopierkonstruktor / zuweisungsoperator mit einem standard-konstruierten rhs aufgerufen. naja, wenn du die parameter des konstruktors eines members festlegen möchtest:</p>
<pre><code>struct A
{
    int data;
    A(int data)
        : data(data)
    {
    }
};
class B
{
    A _a;
public:
    B(int data)
        : _a(data)
    {
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2367758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367758</guid><dc:creator><![CDATA[asfasf]]></dc:creator><pubDate>Mon, 25 Nov 2013 09:58:56 GMT</pubDate></item><item><title><![CDATA[Reply to Lebenszyklus Initlist vs Konstukturbody on Mon, 25 Nov 2013 10:08:23 GMT]]></title><description><![CDATA[<p>Ah ok, das war mein Fehler, anstatt einfach den Parameter zu übergeben habe ich nochmals ein neues Objekt übergeben. Besten Dank, zusätzlich hatte ich noch die Zuweisung in Variante 1 nicht mit bedacht und ich dachte das erzeugt Objekt wäre verloren.</p>
<p>Ok, danke für die Hilfe hier ich muss mich noch mal ganz genau mit den Lebenszyklen beschäftigen. Wisst ihr da eine gute Zusammenfassung, in den Büchern ist dies meist ziemlich verstreut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2367759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2367759</guid><dc:creator><![CDATA[_CppNeuland]]></dc:creator><pubDate>Mon, 25 Nov 2013 10:08:23 GMT</pubDate></item></channel></rss>