<?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[Initialization list: field initializer mit Argumenten?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Codestelle, die ich nicht ganz verstehe:</p>
<pre><code>class TDataTableBase: public ::xml_schema::Type
{
public:
	TDataTableBase (const TDataTableBase&amp; x, ::xml_schema::Flags f = 0, ::xml_schema::Container* c = 0);
protected:
    ::xsd::cxx::tree::one&lt; DescriptionType &gt; Description_;
    ::xsd::cxx::tree::one&lt; DataType &gt; Data_;
};
</code></pre>
<pre><code>TDataTableBase::
  TDataTableBase (const TDataTableBase&amp; x,
                  ::xml_schema::Flags f,
                  ::xml_schema::Container* c)
  : ::xml_schema::Type (x, f, c),
    Description_ (x.Description_, f, this),
    Data_ (x.Data_, f, this)
  {
  }
</code></pre>
<p>Wie genau muss man die initialization list verstehen? Also das erste Element ::xml_schema::Type ist der Konstruktor der Basisklasse, aber was kommt dann? Description_ und Data_ sind Felder der Klasse, aber warum kann man die mit Argumenten aufrufen?</p>
<p>Vielen Dank im Voraus für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/315723/initialization-list-field-initializer-mit-argumenten</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 13:08:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/315723.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 10 Apr 2013 10:08:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Initialization list: field initializer mit Argumenten? on Wed, 10 Apr 2013 10:08:06 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Codestelle, die ich nicht ganz verstehe:</p>
<pre><code>class TDataTableBase: public ::xml_schema::Type
{
public:
	TDataTableBase (const TDataTableBase&amp; x, ::xml_schema::Flags f = 0, ::xml_schema::Container* c = 0);
protected:
    ::xsd::cxx::tree::one&lt; DescriptionType &gt; Description_;
    ::xsd::cxx::tree::one&lt; DataType &gt; Data_;
};
</code></pre>
<pre><code>TDataTableBase::
  TDataTableBase (const TDataTableBase&amp; x,
                  ::xml_schema::Flags f,
                  ::xml_schema::Container* c)
  : ::xml_schema::Type (x, f, c),
    Description_ (x.Description_, f, this),
    Data_ (x.Data_, f, this)
  {
  }
</code></pre>
<p>Wie genau muss man die initialization list verstehen? Also das erste Element ::xml_schema::Type ist der Konstruktor der Basisklasse, aber was kommt dann? Description_ und Data_ sind Felder der Klasse, aber warum kann man die mit Argumenten aufrufen?</p>
<p>Vielen Dank im Voraus für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314346</guid><dc:creator><![CDATA[hejira123]]></dc:creator><pubDate>Wed, 10 Apr 2013 10:08:06 GMT</pubDate></item><item><title><![CDATA[Reply to Initialization list: field initializer mit Argumenten? on Wed, 10 Apr 2013 10:17:01 GMT]]></title><description><![CDATA[<p>Das sind die Konstruktoren dieser Member. Das ist es, wozu Initialisierungslisten da sind. Ich bin gerade etwas verwirrt, wie du einerseits wissen kannst, was eine Initialisierungsliste ist und wie sie funktioniert, aber andererseits nicht weißt was sie ist und wie sie funktioniert. <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>
<p>Wenn ich es so schreibe, verstehst du es dann?</p>
<pre><code>struct foo
{
  int i;
  std::vector&lt;double&gt; v;
  foo() : i(0), v(123, 1.0) { }
}
</code></pre>
<p>In deinem Beispiel passiert nichts anderes, außer dass am Anfang noch die Basisklasse initialisiert wird (was du ja anscheinend schon verstanden hast)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314348</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Apr 2013 10:17:01 GMT</pubDate></item><item><title><![CDATA[Reply to Initialization list: field initializer mit Argumenten? on Wed, 10 Apr 2013 11:03:28 GMT]]></title><description><![CDATA[<p>Okay, danke, jetzt verstehe ich das. Ich dachte bisher immer, die Syntax wäre einfach so, also dass wenn man ein Member i initialisieren will, man i( &lt;wert&gt; ) schreibt. Aber wenn ich dich richtig verstehe, ruft man in Wirklichkeit die Konstruktoren der Member auf, nur dass es im einfachen Fall der Copy-Konstruktor ist, wohingegen in meinem Fall ein anderer Konstruktor mit mehreren Parametern aufgerufen wird? Aber ist die Reihenfolge in einer Initialisierungsliste dann festgelegt, also zuerst der Konstruktor der Basisklasse, dann die Member, oder kann man das auch in einer anderen Reihenfolge angeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314357</guid><dc:creator><![CDATA[hejira]]></dc:creator><pubDate>Wed, 10 Apr 2013 11:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Initialization list: field initializer mit Argumenten? on Wed, 10 Apr 2013 11:28:17 GMT]]></title><description><![CDATA[<p>hejira schrieb:</p>
<blockquote>
<p>Aber wenn ich dich richtig verstehe, ruft man in Wirklichkeit die Konstruktoren der Member auf, nur dass es im einfachen Fall der Copy-Konstruktor ist, wohingegen in meinem Fall ein anderer Konstruktor mit mehreren Parametern aufgerufen wird?</p>
</blockquote>
<p>Ja.</p>
<blockquote>
<p>Aber ist die Reihenfolge in einer Initialisierungsliste dann festgelegt, also zuerst der Konstruktor der Basisklasse, dann die Member, oder kann man das auch in einer anderen Reihenfolge angeben?</p>
</blockquote>
<p>Die Regeln sind:<br />
1. Die Reihenfolge in der du die Initialisierungsliste schreibst, ist vollkommen schnuppe. Die Liste gibt bloß an, mit welchen Argumenten die Konstruktoren ausgerufen werden, nicht ihre Reihenfolge. Du solltest dich aber an die echte Initialisierungsreihenfolge halten, damit du dich nicht selber verwirrst.<br />
2. Zuerst werden virtuelle Basisklassen initialisiert, in der Reihenfolge (links nach rechts) wie sie bei der Angabe der Basisklassen stehen<br />
3. Danach kommen andere Basisklassen, wieder von links nach rechts<br />
4. Dann kommen (nicht-statische) Member dran. In der Reihenfolge (von oben nach unten) wie sie in der Klassendefinition stehen.<br />
5. Danach wird der Konstruktor selber ausgeführt</p>
<p>Das war sehr technisch. Die Regeln zum Merken sind:<br />
- Zuerst kommen Basisklassen<br />
- Dann Member von oben nach unten<br />
- Reihenfolge in der Initialisierungsliste ist egal<br />
- Die Reihenfolge im Destruktor ist genau umgekehrt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314364</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Apr 2013 11:28:17 GMT</pubDate></item><item><title><![CDATA[Reply to Initialization list: field initializer mit Argumenten? on Wed, 10 Apr 2013 13:24:55 GMT]]></title><description><![CDATA[<p>Super! Vielen Dank für die kompetente Hilfe. <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/2314407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314407</guid><dc:creator><![CDATA[hejira]]></dc:creator><pubDate>Wed, 10 Apr 2013 13:24:55 GMT</pubDate></item><item><title><![CDATA[Reply to Initialization list: field initializer mit Argumenten? on Wed, 10 Apr 2013 14:52:38 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>2. Zuerst werden virtuelle Basisklassen initialisiert, in der Reihenfolge (links nach rechts) wie sie bei der Angabe der Basisklassen stehen</p>
</blockquote>
<p>Kleine Präzisierung: es werden alle virtuellen Basisklassen direkt von vom Konstruktor der am weitestesten abgeleiteten Klasse (also des dynamischen Typs nach Abschluss der Konstruktion) intialisiert, die irgendwo in der Vererbungshierarchie auftauchen (in der Reihenfolge, wie sie bei Tiefensuche auftauchen, jeweils von links nach rechts); auch solche also, die nur indirekt geerbt werden. Ist die Klasse, in der unser Konstruktor sich befindet, dagegen selbst eine Basisklasse, so wird der Teil der Initialisierungliste, der die virtuellen Basisklassen betrifft, übergangen (es werden also auch keine Ausdrücke ausgewertet, die als Argumente für Konstruktion der virtuellen Basen dienen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2314448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2314448</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 10 Apr 2013 14:52:38 GMT</pubDate></item></channel></rss>