<?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[Reihenfolge der Inititialisierung in Klasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes:</p>
<pre><code>class Foo
{
public:
    Foo();
private:
    A a;
    B b;
    C c;
};

Foo::Foo() : b(), a(), c()
{
    // a is initialized first, then b, then c - NOT b, a, then c!
}
</code></pre>
<p>Der C++11 Standard garantiert dass die Member in der Reihenfolge initialisiert werden, wie in der Header definiert.</p>
<p>Nun habe ich aber das Problem, dass ich bei einem Programm ein anderes Verhalten habe.</p>
<pre><code>class Foo
{
public:
    Foo();
private:
    A a;
    B b;
    C c;
};

Foo::Foo(A&amp; a, B&amp; b, C&amp; c) : a(a), b(CreateData(a.data), c(c)
{
    // a is initialized first, then b, then c - NOT b, a, then c!
}
</code></pre>
<p>Ich bekomme bei CreateData keine validen Daten für a.data. Es scheint, als ob a noch nicht initialisiert wäre, obwohl das Member a vor dem Member b definiert ist in der Header. <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334241/reihenfolge-der-inititialisierung-in-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 20:51:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334241.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 31 Aug 2015 11:02:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 11:02:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgendes:</p>
<pre><code>class Foo
{
public:
    Foo();
private:
    A a;
    B b;
    C c;
};

Foo::Foo() : b(), a(), c()
{
    // a is initialized first, then b, then c - NOT b, a, then c!
}
</code></pre>
<p>Der C++11 Standard garantiert dass die Member in der Reihenfolge initialisiert werden, wie in der Header definiert.</p>
<p>Nun habe ich aber das Problem, dass ich bei einem Programm ein anderes Verhalten habe.</p>
<pre><code>class Foo
{
public:
    Foo();
private:
    A a;
    B b;
    C c;
};

Foo::Foo(A&amp; a, B&amp; b, C&amp; c) : a(a), b(CreateData(a.data), c(c)
{
    // a is initialized first, then b, then c - NOT b, a, then c!
}
</code></pre>
<p>Ich bekomme bei CreateData keine validen Daten für a.data. Es scheint, als ob a noch nicht initialisiert wäre, obwohl das Member a vor dem Member b definiert ist in der Header. <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466312</guid><dc:creator><![CDATA[Stevo546]]></dc:creator><pubDate>Mon, 31 Aug 2015 11:02:00 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 11:04:48 GMT]]></title><description><![CDATA[<p>benenne die Parameter mal um. könnte sein, dass es dadurch zu Namenskollisionen kommt, die nicht so aufgelöst werden, wie du das gerne hättest</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466313</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 31 Aug 2015 11:04:48 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 11:08:07 GMT]]></title><description><![CDATA[<p>Villeicht ist der Copy-c'tor von A fehlerhaft?!</p>
<p>Zeig <a href="https://www.c-plusplus.net/forum/304133">ein komplettes minimales Beispiel</a> , an dem man den Fehler nachvollziehen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466314</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Mon, 31 Aug 2015 11:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 11:10:50 GMT]]></title><description><![CDATA[<p>daddy_felix schrieb:</p>
<blockquote>
<p>benenne die Parameter mal um. könnte sein, dass es dadurch zu Namenskollisionen kommt, die nicht so aufgelöst werden, wie du das gerne hättest</p>
</blockquote>
<p>Den gleichen Namen für die Parameter wie für die Membervariablen ist OK. Allerdings wird bei <code>a.data</code> dann der Parameter genommen und nicht die Membervariable. Je nachdem was CreateData macht könnte es dann Probleme geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466316</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 31 Aug 2015 11:10:50 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 11:13:46 GMT]]></title><description><![CDATA[<p>Der Standard definiert die Reihenfolge für a, b, c, aber nicht für CreateData(a.data), d.h. die Funktion könnte als erstes aufgerufen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466317</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466317</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 31 Aug 2015 11:13:46 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 11:14:08 GMT]]></title><description><![CDATA[<p>Ein komplettes Beispiel ist schwierig, weil der Code hier komplex ist.</p>
<p>(I)B ist eigentlich ein Interface und CreateData() ist eine freie Funktion, die eine statische Factory-Methode aufruft, die ein Objekt vom Typ B zurückliefert das dem Interface IB entspricht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466318</guid><dc:creator><![CDATA[Stevo546]]></dc:creator><pubDate>Mon, 31 Aug 2015 11:14:08 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 11:35:37 GMT]]></title><description><![CDATA[<p>Achja,</p>
<p>der Aufruf a(a) ist eigentlich ein Konstruktoraufrug, d.h. a ist eine Klasse, die einen Konstruktor hat, der mit a(a) initialisiert wird. <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466324</guid><dc:creator><![CDATA[Stevo546]]></dc:creator><pubDate>Mon, 31 Aug 2015 11:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 11:36:43 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Der Standard definiert die Reihenfolge für a, b, c, aber nicht für CreateData(a.data), d.h. die Funktion könnte als erstes aufgerufen werden.</p>
</blockquote>
<p>Das würde meine Beobachtung erklären. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466325</guid><dc:creator><![CDATA[Stevo546]]></dc:creator><pubDate>Mon, 31 Aug 2015 11:36:43 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 12:01:29 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Der Standard definiert die Reihenfolge für a, b, c, aber nicht für CreateData(a.data), d.h. die Funktion könnte als erstes aufgerufen werden.</p>
</blockquote>
<p>Dem ist nicht so.<br />
Jeder Initialisierer ist eine <em>full-expression</em>, und die werden in der bekannten Reihenfolge ausgewertet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466328</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Mon, 31 Aug 2015 12:01:29 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 12:14:12 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Der Standard definiert die Reihenfolge für a, b, c, aber nicht für CreateData(a.data), d.h. die Funktion könnte als erstes aufgerufen werden.</p>
</blockquote>
<p>Selbst wenn dem so wäre (ich hab keine Ahnung), spielt das im gezeigten Beispiel keine Rolle weil in der CreateData Funktion der Parameter <code>a</code> verwendet wird und nicht die Membervariable!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466333</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Mon, 31 Aug 2015 12:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to Reihenfolge der Inititialisierung in Klasse on Mon, 31 Aug 2015 12:31:43 GMT]]></title><description><![CDATA[<p>Furble Wurble schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Der Standard definiert die Reihenfolge für a, b, c, aber nicht für CreateData(a.data), d.h. die Funktion könnte als erstes aufgerufen werden.</p>
</blockquote>
<p>Dem ist nicht so.<br />
Jeder Initialisierer ist eine <em>full-expression</em>, und die werden in der bekannten Reihenfolge ausgewertet.</p>
</blockquote>
<p>Stimmt. In C++98 ist es zwar anders formuliert aber effektiv das gleiche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2466336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2466336</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Mon, 31 Aug 2015 12:31:43 GMT</pubDate></item></channel></rss>