<?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[Verständnisproblem: Elementinitialisierer]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich beschäftige mich gerade mit der &quot;Initialiserung von Teilobjekten&quot;. Ich habe eben den Elementinitialisierer kennengelernt. Bis jetzt kannte ich diesen (Doppelpunkt) nur aus der Rubrik &quot;Vererbung&quot;.</p>
<p>Leider ist mir der Sinn hinter einer solchen Elementinitialisierung nicht ganz klar. Bis jetzt habe ich meinen Konstruktor immer folgendermaßen geschrieben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class CTest //Beispielklasse
{
private:
	int zahl;
public:
	CTest(int);
	const int&amp; getZahl() const {return zahl;};
};

CTest::CTest(int z = 0) //ein für mich gewöhnlicher Konstruktor
{
 zahl = z;
}

int main()
{
	CTest test(100);
	cout &lt;&lt; test.getZahl();
	return 0;
}
</code></pre>
<p>Nun habe ich gelernt, dass man den Konstruktor auch mit dem Elementinitialisierer schreiben kann, wobei das Gleiche dabei herauskommt:</p>
<pre><code class="language-cpp">CTest::CTest(int z = 0) : zahl(z)
{
}
</code></pre>
<p>Nun habe ich einen leeren Anweisungsblock, doch ich verstehe nicht so recht, wo der Vorteil liegt.</p>
<p>Braucht man diesen Operator (außer bei der Vererbung) häufig? Wo liegen die Vorteile. Bei meinem Beispiel sehe ich keine.</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270844/verständnisproblem-elementinitialisierer</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 22:11:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270844.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 19 Jul 2010 10:07:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 10:07:58 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich beschäftige mich gerade mit der &quot;Initialiserung von Teilobjekten&quot;. Ich habe eben den Elementinitialisierer kennengelernt. Bis jetzt kannte ich diesen (Doppelpunkt) nur aus der Rubrik &quot;Vererbung&quot;.</p>
<p>Leider ist mir der Sinn hinter einer solchen Elementinitialisierung nicht ganz klar. Bis jetzt habe ich meinen Konstruktor immer folgendermaßen geschrieben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class CTest //Beispielklasse
{
private:
	int zahl;
public:
	CTest(int);
	const int&amp; getZahl() const {return zahl;};
};

CTest::CTest(int z = 0) //ein für mich gewöhnlicher Konstruktor
{
 zahl = z;
}

int main()
{
	CTest test(100);
	cout &lt;&lt; test.getZahl();
	return 0;
}
</code></pre>
<p>Nun habe ich gelernt, dass man den Konstruktor auch mit dem Elementinitialisierer schreiben kann, wobei das Gleiche dabei herauskommt:</p>
<pre><code class="language-cpp">CTest::CTest(int z = 0) : zahl(z)
{
}
</code></pre>
<p>Nun habe ich einen leeren Anweisungsblock, doch ich verstehe nicht so recht, wo der Vorteil liegt.</p>
<p>Braucht man diesen Operator (außer bei der Vererbung) häufig? Wo liegen die Vorteile. Bei meinem Beispiel sehe ich keine.</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928470</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:07:58 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 10:19:42 GMT]]></title><description><![CDATA[<p>heyho,</p>
<p>Die Initialisierungsliste dient dem Initialisieren objektzugehöriger Attribute (nicht-statischer Attribute) der eigenen Klasse.</p>
<p>Vorteile:</p>
<p>1. Referencen und Konstanten können nur mittels Initialisierungsliste initialisiert werden.</p>
<p>2. Den Konstruktor der Basisklasse kannst du nur mittels Initialisierungslite aufrufen.</p>
<p>3. Initialisierungsliste hat Performmancevorteil, da die Initialisierungsliste , wie's der Name schon sagt, die Attribute initialisiert.<br />
Machst du es ohne Initialisierungsliste, so werden die Attribute zuerst definiert, und dann wird ihnen im Rumpf etwas zugewiesen... es sind also 2Schritte nötig... mit einer Initialisierungsliste nur 1Schritt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928478</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:19:42 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 10:24:20 GMT]]></title><description><![CDATA[<p>Der Sinn der Initialisierungsliste ist es, im Konstruktor nicht den Standardkonstruktor der Member aufzurufen, sondern einen anderen zu wählen. Das hat den Vorteil, dass der Aufruf des Standardkonstruktors gespart werden kann und ist nötig, wenn bestimmte Member keinen Standardkonstruktor haben.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">struct foo
{
    int&amp; i;
    const int ci;
    string s;

    // falsch:
    foo(int&amp; ref)
    // bevor die 1. Anweisung ausgeführt wird, werden alle Standardkonstruktoren aufgerufen
    // Fehler: int&amp; hat keinen Standardkonstruktor
    {
        i = ref;   // illegal
        ci = 42;   // illegal --&gt; ci hätte undefinierten Wert
        s = &quot;Hallo&quot;; // operator= wird aufgerufen --&gt; man hätte sich den Standardkonstruktoraufruf sparen können
    }

    // besser:
    foo(int&amp; ref) : i(ref) /* jetzt möglich */, ci(42) /* auch möglich */, s(&quot;Hallo&quot;) /* Konstruktor string(const char*) wird aufgerufen, Standardkonstruktor wird gespart */
    {
        // keine weiteren Anweisungen nötig
    }
};
</code></pre>
<p>In deinem Beispiel ist das egal, allerdings empfehle ich dir, dir die Initialisierungsliste grundsätzlich zugunsten der Konsistenz anzugewöhnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928479</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:24:20 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 10:23:00 GMT]]></title><description><![CDATA[<p>In deinem oberen Beispiel wird zahl halt doppelt gesetzt. Erst wird es standardmäßig mit 0 initialisiert, und dann wird es im Rumpf des Konstruktors auf z gesetzt. Das untere Beispiel initialisiert zahl direkt mit z. Wenn du dort statt einem einfachen int eine Klasse hast, kann da auch etwas ganz anderes rauskommen. Es wird dort standardmäßig der Konstruktor ohne Parameter aufgerufen um das Objekt zu initialisieren. Soll direkt ein Konstruktor mit Parameter aufgerufen werden, brauchst du den Elementinitialisierer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928481</guid><dc:creator><![CDATA[Tobiking2]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:23:00 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 10:31:18 GMT]]></title><description><![CDATA[<p>Hi,<br />
das mit der Initialisierung der Referenzen und Konstanten wusste ich nicht. Dass man Konstanten erst später initialisieren kann, ist ja irre <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21761">@Tobiking2</a>: Das leuchtet sein. Der Elementinitialisierer hat mich überzeugt.</p>
<p>Vielen Dank<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928485</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928485</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:31:18 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 10:49:43 GMT]]></title><description><![CDATA[<p>Tobiking2 schrieb:</p>
<blockquote>
<p>In deinem oberen Beispiel wird zahl halt doppelt gesetzt. Erst wird es standardmäßig mit 0 initialisiert, und dann wird es im Rumpf des Konstruktors auf z gesetzt.</p>
</blockquote>
<p>Das wage ich zu bezweifeln.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class CTest
{
private:
    int zahl;
public:
    CTest(int);
    const int&amp; getZahl() const {return zahl;};
};

CTest::CTest(int z = 0)
{
     cout &lt;&lt; zahl &lt;&lt; endl; // zufälliger Wert, da wird nichts auto. mit 0 initialisiert.
}

int main()
{
    CTest test(100);

    getchar();

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1928494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928494</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:49:43 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 10:54:45 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Dass man Konstanten erst später initialisieren kann, ist ja irre.</p>
</blockquote>
<p>Hä, wie meinst du den das?</p>
<p>Man kann nie etwas &quot;später initialisieren&quot; (initial = Anfang),<br />
man kann nur &quot;später etwas anders zuweisen&quot;, was bei Konstanten bekanntlicherweise nicht geht.</p>
<p>Initialisierung = Definition mit Defaultzuweisung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928495</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 19 Jul 2010 10:54:45 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 11:02:03 GMT]]></title><description><![CDATA[<p>Dweb schrieb:</p>
<blockquote>
<p>Das wage ich zu bezweifeln.</p>
</blockquote>
<p>Hmm, du hast Recht. Aber irgendwie trudelt mir diese Nullinitialisierung bei Membervariablen durch den Kopf. War das vielleicht der Fall wenn man das Objekt per new erzeugt? Oder bin ich da ganz nach Java abgedriftet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928500</guid><dc:creator><![CDATA[Tobiking2]]></dc:creator><pubDate>Mon, 19 Jul 2010 11:02:03 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 11:07:49 GMT]]></title><description><![CDATA[<p>Tobiking2 schrieb:</p>
<blockquote>
<p>Dweb schrieb:</p>
<blockquote>
<p>Das wage ich zu bezweifeln.</p>
</blockquote>
<p>Hmm, du hast Recht. Aber irgendwie trudelt mir diese Nullinitialisierung bei Membervariablen durch den Kopf.</p>
</blockquote>
<p>Globale Variablen werden automatisch mit 0 initialisiert, falls nichts angegeben wird, oder du hast es mit Java verwechselt <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>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int i;
static int si;

int main()
{
    cout &lt;&lt; i &lt;&lt; endl &lt;&lt; si;

    cin.sync();
    cin.get();
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1928502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928502</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 19 Jul 2010 11:07:49 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 12:07:51 GMT]]></title><description><![CDATA[<p>Ok, das mit &quot;später initialisieren war falsch&quot;. Sie werden ja direkt initialisiert. Ich kannte nur diese Methode nicht, doch sie gefällt mir immer mehr.</p>
<p>Danke!<br />
lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928538</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 19 Jul 2010 12:07:51 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 13:30:09 GMT]]></title><description><![CDATA[<p>freakC++ schrieb:</p>
<blockquote>
<p>Ok, das mit &quot;später initialisieren war falsch&quot;. Sie werden ja direkt initialisiert. Ich kannte nur diese Methode nicht, doch sie gefällt mir immer mehr.</p>
</blockquote>
<p>Nur nochmal etwas Klarer:</p>
<p>Die Initialisierung findet ausschließlich in der Initialisierungsliste statt, im Konstruktorrumpf werden nachträgliche Zuweisungen durchgeführt (dein Text deutet an, das du die Zuweisung im Konstruktor weiterhin als Initialisierung betrachtest - umgangssprachlich würde ich dem beipflichten, programmiertechnisch nicht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1928599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928599</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Mon, 19 Jul 2010 13:30:09 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisproblem: Elementinitialisierer on Mon, 19 Jul 2010 15:44:13 GMT]]></title><description><![CDATA[<p>Tobiking2 schrieb:</p>
<blockquote>
<p>Aber irgendwie trudelt mir diese Nullinitialisierung bei Membervariablen durch den Kopf. War das vielleicht der Fall wenn man das Objekt per new erzeugt? Oder bin ich da ganz nach Java abgedriftet?</p>
</blockquote>
<p>Bei POD-Objekten führt eine Klammer (Syntax eines Defaultkonstruktor-Aufrufs, es sind jedoch keine Konstruktoren vorhanden) zu einer Null-Initialisierung.</p>
<pre><code class="language-cpp">// Konstruktor-Initialisierungsliste
MyClass::MyClass() : myPOD() {}

// temporäres Objekt
POD myPOD = POD();

// new-Ausdruck
new POD();
</code></pre>
<p>Nicht initialisiert wird das Objekt hingegen in solchen Situationen:</p>
<pre><code class="language-cpp">MyClass::MyClass() {}

POD myPOD;

new POD;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1928696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1928696</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 19 Jul 2010 15:44:13 GMT</pubDate></item></channel></rss>