<?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[Initlist in constructor + order]]></title><description><![CDATA[<p>Ich habe mal gelesen dass die Reihenfolge der Initialisierungen in der Initialisierungsliste wichtig ist, aber ich weiß nicht mehr wo das war. Was ist der Grund hierfür?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272327/initlist-in-constructor-order</link><generator>RSS for Node</generator><lastBuildDate>Fri, 28 Aug 2026 23:19:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272327.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 15 Aug 2010 16:11:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Initlist in constructor + order on Sun, 15 Aug 2010 16:11:56 GMT]]></title><description><![CDATA[<p>Ich habe mal gelesen dass die Reihenfolge der Initialisierungen in der Initialisierungsliste wichtig ist, aber ich weiß nicht mehr wo das war. Was ist der Grund hierfür?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940295</guid><dc:creator><![CDATA[loppi]]></dc:creator><pubDate>Sun, 15 Aug 2010 16:11:56 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Sun, 15 Aug 2010 16:19:33 GMT]]></title><description><![CDATA[<p>Dass es auf die Reihenfolge in der Initialisierungsliste drauf an kommt und nicht in der Klassendefinition ist reine Konvention. Warum aber die Reihenfolge wichtig ist, zeigt sich an folgendem Beispiel:</p>
<pre><code class="language-cpp">struct foo
{
 foo ():
  value ( obj-&gt;get_value () ),
  obj ( new some_object () )
 {}

 some_object* obj;
 int value;
};
</code></pre>
<p>So kriegst du undefiniertes Verhalten (weil der Zeiger noch nicht initialisiert ist und somit auf kein gültiges Objekt zeigt).<br />
Wenn man die Reihenfolge umkehrt, dann ist es definiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940297</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 15 Aug 2010 16:19:33 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Sun, 15 Aug 2010 16:23:24 GMT]]></title><description><![CDATA[<p>Beispiel:</p>
<pre><code class="language-cpp">class DataClass
{
public:
  DataClass(int size) : m_size(size), m_data(new double[m_size]) {}

private:
  int m_size;
  double* m_data;
};
</code></pre>
<p>Also wenn du irgendwelche Abhängigkeiten drin hast.<br />
Wenn du hier die Liste vertauschst, hast du ja m_size noch keinen Wert zugewiesen und das klappt nicht.</p>
<p>Also das Beispiel ist vielleicht nicht das schönste weil man ja auch new double[size] machen könnte, aber ich denke es drückt die Wichtigkeit der Reihenfolge aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940299</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Sun, 15 Aug 2010 16:23:24 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Tue, 22 Nov 2011 13:59:14 GMT]]></title><description><![CDATA[<p>Die Reihenfolge der Initialisierungen entspricht der Reihenfolge der Attribut-Deklarationen. Wenn du da nicht aufpasst, kommt nichts Gutes bei raus, wie hierbei z.B.:</p>
<pre><code class="language-cpp">class A
{
    private:
        int a;
        int b;

    public:
        A() : b(7), a(b) {} // schlecht --&gt; a wird mit b initialisiert, b hat aber einen undefinierten Wert.
};

int main() {}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1940300</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940300</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 22 Nov 2011 13:59:14 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Sun, 15 Aug 2010 16:26:23 GMT]]></title><description><![CDATA[<p>aso ja das ist klar.</p>
<p>dachte eher an ganz was anderes. danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940302</guid><dc:creator><![CDATA[loppi]]></dc:creator><pubDate>Sun, 15 Aug 2010 16:26:23 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Sun, 15 Aug 2010 16:35:28 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct foo
{
 foo ():
  value ( obj-&gt;get_value () ), // 2.
  obj ( new some_object () )   // 1.
 {}
  
 some_object* obj;
 int value;
};
</code></pre>
</blockquote>
<p>Dieses Beispiel ist korrekt, da hast du doch kein undefiniertes Verhalten.</p>
<p><em>Die Reihenfolge der Initialisierungen hängt von der Reihenfolge der Attribut-Deklarationen ab.</em></p>
<p>Bei deinem Beispiel wird der Zeiger zuerst initialisiert und danach greifst du auf get_value zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940306</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 15 Aug 2010 16:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Sun, 15 Aug 2010 16:43:20 GMT]]></title><description><![CDATA[<p>Dweb schrieb:</p>
<blockquote>
<p>Die Reihenfolge der Initialisierungen entspricht der Reihenfolge der Attribut-Deklarationen. Wenn du da nicht aufpasst, dann kommt Murx raus, wie hierbei z.B.:</p>
<pre><code class="language-cpp">class A
{
    private:
        int a;
        int b;
        
    public:
        A() : b(7), a(b) {} // schlecht --&gt; a wird mit b initialisiert, b hat aber einen undefinierten Wert.
    
};

int main() {}
</code></pre>
</blockquote>
<p>Das bin ich dagegen. Es kommt auf die Reihenfolge in der Initialisierungsliste an, nicht auf die Reihenfolge der Attributdeklaration. Das Beispiel so wie es ist funktioniert einwandfrei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940311</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Sun, 15 Aug 2010 16:43:20 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Sun, 15 Aug 2010 16:47:08 GMT]]></title><description><![CDATA[<p>Oh jetzt hab ich Mist erzählt. Sorry. Du hattest wirklich Recht. Es kommt auf die Reihenfolge der Deklaration an.</p>
<p>Das Beispiel hab ich mal erweitert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct A
{
  int a;
  int b;

  A() : b(7), a(b) {}  
};

int main() {
  A a;
  std::cout &lt;&lt; &quot;a.a=&quot; &lt;&lt; a.a &lt;&lt; std::endl;
  std::cout &lt;&lt; &quot;a.b=&quot; &lt;&lt; a.b &lt;&lt; std::endl;
}
</code></pre>
<p>Ausgabe ist:</p>
<p>a.a=0<br />
a.b=7</p>
<p>Also bitte vergesst was ich geschrieben hab ^^.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940314</guid><dc:creator><![CDATA[Max3000]]></dc:creator><pubDate>Sun, 15 Aug 2010 16:47:08 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Sun, 15 Aug 2010 20:24:07 GMT]]></title><description><![CDATA[<p>Dweb schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct foo
{
 foo ():
  value ( obj-&gt;get_value () ), // 2.
  obj ( new some_object () )   // 1.
 {}
  
 some_object* obj;
 int value;
};
</code></pre>
</blockquote>
<p>Dieses Beispiel ist korrekt, da hast du doch kein undefiniertes Verhalten.</p>
<p><em>Die Reihenfolge der Initialisierungen hängt von der Reihenfolge der Attribut-Deklarationen ab.</em></p>
<p>Bei deinem Beispiel wird der Zeiger zuerst initialisiert und danach greifst du auf get_value zu.</p>
</blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18422">@drakon</a>:<br />
Da würde ich dich auch gerne nochmal fragen ob du das nicht vertauschst hast, ich war nämlich auch der Meinung die Dweb vertritt.<br />
Nicht dass ich hier jetzt was falsch verstehe :p</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940378</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940378</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Sun, 15 Aug 2010 20:24:07 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Sun, 15 Aug 2010 23:20:06 GMT]]></title><description><![CDATA[<p>Ja. Wir sind hier alle ein wenig verwirrt.<br />
Sollte während Prüfungszeit nichts posten. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Hier nochmal klipp und klar aus dem Standard:</p>
<p>12.6.2/5 schrieb:</p>
<blockquote>
<p>— Then, nonstatic data members shall be initialized in the order they were declared in the class definition<br />
(again regardless of the order of the mem-initializers).</p>
</blockquote>
<p>Es kommt auf die Reihenfolge in der Klassendefinition an. Mein obiges Beispiel ist in der Tat korrekt und das ist, denke ich der wichtigte Punkt, dass man sich eben nicht auf die Reihenfolge in der Initialisierungsliste verlässt und da dann verwirrt ist, weil sich das nicht sequentiell verhält.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940406</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 15 Aug 2010 23:20:06 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Sun, 15 Aug 2010 23:27:05 GMT]]></title><description><![CDATA[<p>Der g++ spuckt normalerweise sogar eine warning aus wenn die Reihenfolge in der Initliste von der Reihenfolge der Deklarationen abweicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940407</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 15 Aug 2010 23:27:05 GMT</pubDate></item><item><title><![CDATA[Reply to Initlist in constructor + order on Mon, 16 Aug 2010 04:46:25 GMT]]></title><description><![CDATA[<p>Also als Hilfe, wenn man sich es anders nicht merken kann:</p>
<p>Member müssen in der umgekehrten Reihenfolge zerstört werden wie sie konstruiert wurden. Jetzt kann der Konstruktor aber in einer ganz anderen Übersetzungseinheit stehen als der Destruktor. Woher sollte der Compiler beim compilieren des Destruktors nun die korrekte Reihenfolge kennen, wenn diese der Init-Liste des Konstruktors zu entnehmen wäre, den er gar nicht sieht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1940413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1940413</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 16 Aug 2010 04:46:25 GMT</pubDate></item></channel></rss>