<?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[Defaultkonstruktor der Basisklasse hat seltsames Verhalten]]></title><description><![CDATA[<p>Hallo C++-Forum, ich bin neu hier <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>
<p>Mein Problem hat tausend Worte oder einen Source-Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;
/*** basis ohne eigenen default constructor ***/
class X
{
    public:
     int i;
     void foo() { cout &lt;&lt; &quot;X::foo() -&gt; X::i: &quot; &lt;&lt; i &lt;&lt; endl;
};

class Y : public X
{
    public:
     Y() { cout &lt;&lt; &quot;Konstruktor Y ruft geerbtes X::i : &quot; &lt;&lt; i &lt;&lt; endl; }
     void foo() { cout &lt;&lt; &quot;Y::foo() -&gt; X::i: &quot; &lt;&lt; i &lt;&lt; endl; }
};

/*** basis mit eigenem default constructor ***/
class XA
{
    public:
     int i;
     XA() { cout &lt;&lt; &quot;Konstruktor XA ruft XA::i : &quot; &lt;&lt; i &lt;&lt; endl; }
     void foo() { cout &lt;&lt; &quot;XA::foo() -&gt; XA::i: &quot; &lt;&lt; i &lt;&lt; endl; }

};

class YA : public XA
{
    public:
     YA() { cout &lt;&lt; &quot;Konstruktor YA ruft geerbtes XA::i : &quot; &lt;&lt; i &lt;&lt; endl; }
     void foo() { cout &lt;&lt; &quot;YA::foo() -&gt; XA::i: &quot; &lt;&lt; i &lt;&lt; endl; }
};

int main()
{
    /** aufruf basis ohne eigenen default construktor **/
    cout &lt;&lt; &quot;X ohne eigenen Konstruktor&quot; &lt;&lt; endl;
    X x;
    X* px = &amp;x;
    px-&gt;foo();

    Y y;
    Y* py = &amp;y;
    py-&gt;foo();

    /** aufruf basis mit eigenem default construktor **/
    cout &lt;&lt; endl &lt;&lt; &quot;XA mit eigenem Konstruktor&quot; &lt;&lt; endl;
    XA xa;
    XA* pxa = &amp;xa;
    pxa-&gt;foo();

    cout &lt;&lt; endl;

    YA ya;
    YA* pya = &amp;ya;
    pya-&gt;foo();

    return 0;
}
</code></pre>
<p>Es erfolgt die Ausgabe:</p>
<pre><code>X ohne explizit definierten Default-Konstruktor
X::foo() -&gt; X::i: 248255744
Konstruktor Y ruft geerbtes X::i : 0 &lt;-- siehe hier!
Y::foo() -&gt; X::i: 0

XA mit explizit definiertem Default-Konstruktor
Konstruktor XA ruft XA::i : 100230768
XA::foo() -&gt; XA::i: 100230768

Konstruktor XA ruft XA::i : 248255768
Konstruktor YA ruft geerbtes XA::i : 248255768 &lt;-- und siehe hier!
YA::foo() -&gt; XA::i: 248255768
</code></pre>
<p>Wie man gut sehen kann hat die Y-Klasse ein geerbtes Datenfeld Y::i der X-Klasse. Wenn nun <strong>kein</strong> Default-Konstruktor in der Basis-Klasse X angegeben ist, wird das in der Y-Klasse geerbte Datenelement Y::i mit 0 initialisiert??? &lt;-- Warum?</p>
<p>ABER... wenn die Basis-Klasse einen Default-Konstruktor wie in XA enthält (der aber nichts macht, ausser cout &lt;&lt; i), dann wird das geerbte Datenelement Y::i nicht initialisiert!!! &lt;-- Ok! So wie man es auch eigentlich bei der ersten Variante erwarten würde.</p>
<p><em>Der Compiler ist GCC 4.3.3.</em></p>
<p>Die folgenden Artikel in diesem Forum habe bereits durchgesehen aber keine Antwort gefunden:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-238471-and-highlight-is-basisklasse+defaultkonstruktor.html" rel="nofollow">Problem mit Konstruktor der Basisklasse</a><br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-232951-and-highlight-is-basisklasse+defaultkonstruktor.html" rel="nofollow">Konstruktorproblem bei Mehrfachvererbung</a><br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-232038-and-highlight-is-basisklasse+defaultkonstruktor.html" rel="nofollow">Vererbung mit Klassentemplate, Templateparameter in Initialisierungsliste</a></p>
<p>Ich arbeite gerade die Bücher von &quot;Gert Willms - C++ Das Grundlagenbuch (gut aber mit leichten Fehlern)&quot; und &quot;Ulrich Breymann - C++ Eine Einführung (Referenzwerk)&quot; durch, und finde auch dort auf dieses Verhalten keine Antwort.<br />
<a href="https://duckduckgo.com/?q=isbn+3446212728&amp;cppnetbooks" rel="nofollow">C++: Eine Einführung | ISBN: 3446212728</a> <a href="https://duckduckgo.com/?q=isbn+3815814375&amp;cppnetbooks" rel="nofollow">C++ - das Grundlagen-Buch | ISBN: 3815814375</a></p>
<p>Wäre super wenn Ihr helfen könntet!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249075/defaultkonstruktor-der-basisklasse-hat-seltsames-verhalten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 05:43:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249075.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 02 Sep 2009 13:03:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 15:26:08 GMT]]></title><description><![CDATA[<p>Hallo C++-Forum, ich bin neu hier <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>
<p>Mein Problem hat tausend Worte oder einen Source-Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;
/*** basis ohne eigenen default constructor ***/
class X
{
    public:
     int i;
     void foo() { cout &lt;&lt; &quot;X::foo() -&gt; X::i: &quot; &lt;&lt; i &lt;&lt; endl;
};

class Y : public X
{
    public:
     Y() { cout &lt;&lt; &quot;Konstruktor Y ruft geerbtes X::i : &quot; &lt;&lt; i &lt;&lt; endl; }
     void foo() { cout &lt;&lt; &quot;Y::foo() -&gt; X::i: &quot; &lt;&lt; i &lt;&lt; endl; }
};

/*** basis mit eigenem default constructor ***/
class XA
{
    public:
     int i;
     XA() { cout &lt;&lt; &quot;Konstruktor XA ruft XA::i : &quot; &lt;&lt; i &lt;&lt; endl; }
     void foo() { cout &lt;&lt; &quot;XA::foo() -&gt; XA::i: &quot; &lt;&lt; i &lt;&lt; endl; }

};

class YA : public XA
{
    public:
     YA() { cout &lt;&lt; &quot;Konstruktor YA ruft geerbtes XA::i : &quot; &lt;&lt; i &lt;&lt; endl; }
     void foo() { cout &lt;&lt; &quot;YA::foo() -&gt; XA::i: &quot; &lt;&lt; i &lt;&lt; endl; }
};

int main()
{
    /** aufruf basis ohne eigenen default construktor **/
    cout &lt;&lt; &quot;X ohne eigenen Konstruktor&quot; &lt;&lt; endl;
    X x;
    X* px = &amp;x;
    px-&gt;foo();

    Y y;
    Y* py = &amp;y;
    py-&gt;foo();

    /** aufruf basis mit eigenem default construktor **/
    cout &lt;&lt; endl &lt;&lt; &quot;XA mit eigenem Konstruktor&quot; &lt;&lt; endl;
    XA xa;
    XA* pxa = &amp;xa;
    pxa-&gt;foo();

    cout &lt;&lt; endl;

    YA ya;
    YA* pya = &amp;ya;
    pya-&gt;foo();

    return 0;
}
</code></pre>
<p>Es erfolgt die Ausgabe:</p>
<pre><code>X ohne explizit definierten Default-Konstruktor
X::foo() -&gt; X::i: 248255744
Konstruktor Y ruft geerbtes X::i : 0 &lt;-- siehe hier!
Y::foo() -&gt; X::i: 0

XA mit explizit definiertem Default-Konstruktor
Konstruktor XA ruft XA::i : 100230768
XA::foo() -&gt; XA::i: 100230768

Konstruktor XA ruft XA::i : 248255768
Konstruktor YA ruft geerbtes XA::i : 248255768 &lt;-- und siehe hier!
YA::foo() -&gt; XA::i: 248255768
</code></pre>
<p>Wie man gut sehen kann hat die Y-Klasse ein geerbtes Datenfeld Y::i der X-Klasse. Wenn nun <strong>kein</strong> Default-Konstruktor in der Basis-Klasse X angegeben ist, wird das in der Y-Klasse geerbte Datenelement Y::i mit 0 initialisiert??? &lt;-- Warum?</p>
<p>ABER... wenn die Basis-Klasse einen Default-Konstruktor wie in XA enthält (der aber nichts macht, ausser cout &lt;&lt; i), dann wird das geerbte Datenelement Y::i nicht initialisiert!!! &lt;-- Ok! So wie man es auch eigentlich bei der ersten Variante erwarten würde.</p>
<p><em>Der Compiler ist GCC 4.3.3.</em></p>
<p>Die folgenden Artikel in diesem Forum habe bereits durchgesehen aber keine Antwort gefunden:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-238471-and-highlight-is-basisklasse+defaultkonstruktor.html" rel="nofollow">Problem mit Konstruktor der Basisklasse</a><br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-232951-and-highlight-is-basisklasse+defaultkonstruktor.html" rel="nofollow">Konstruktorproblem bei Mehrfachvererbung</a><br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-232038-and-highlight-is-basisklasse+defaultkonstruktor.html" rel="nofollow">Vererbung mit Klassentemplate, Templateparameter in Initialisierungsliste</a></p>
<p>Ich arbeite gerade die Bücher von &quot;Gert Willms - C++ Das Grundlagenbuch (gut aber mit leichten Fehlern)&quot; und &quot;Ulrich Breymann - C++ Eine Einführung (Referenzwerk)&quot; durch, und finde auch dort auf dieses Verhalten keine Antwort.<br />
<a href="https://duckduckgo.com/?q=isbn+3446212728&amp;cppnetbooks" rel="nofollow">C++: Eine Einführung | ISBN: 3446212728</a> <a href="https://duckduckgo.com/?q=isbn+3815814375&amp;cppnetbooks" rel="nofollow">C++ - das Grundlagen-Buch | ISBN: 3815814375</a></p>
<p>Wäre super wenn Ihr helfen könntet!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770892</guid><dc:creator><![CDATA[DeepCopy]]></dc:creator><pubDate>Wed, 02 Sep 2009 15:26:08 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:11:19 GMT]]></title><description><![CDATA[<p>Das nennt man undefiniertes Verhalten. <code>i</code> wird nirgens initialisiert. Da kann also alles mögliche drin stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770903</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:11:19 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:23:47 GMT]]></title><description><![CDATA[<p>DeepCopy schrieb:</p>
<blockquote>
<p>Wenn nun <strong>kein</strong> Default-Konstruktor in der Basis-Klasse X angegeben ist, wird das in der Y-Klasse geerbte Datenelement Y::i mit 0 initialisiert??? &lt;-- Warum?</p>
</blockquote>
<p>Wenn man selbst keinen Konstruktor angibt, generiert der Compiler einen Default-Konstruktor, der alle Member default-initialisiert (die Default-Initialisierung von int ist 0). Schreibst du den Default-Konstruktor selbst, bist du für's initialisieren der Member zuständig - da du das aber nicht machst, hat die Variable einen zufälligen Wert <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>
<p>edit: Stimmt alles nicht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770904</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:23:47 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:19:29 GMT]]></title><description><![CDATA[<p>Und warum hat dann</p>
<pre><code>X::i //einen Zufallswert
</code></pre>
<p>aber</p>
<pre><code>Y::i //keinen ???, also 0
</code></pre>
<p>Das Y::i == 0 ist, habe ich mehrfach getestet, ist also kein Zufall.</p>
<p>Die Frage also lautet warum, gibt es ein X::i ein undefiniertes Verhalten, wie schon angemerkt (was ich auch erwartet habe), aber in Y::i findet eine Initialisierung statt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770908</guid><dc:creator><![CDATA[DeepCopy]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:19:29 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:22:36 GMT]]></title><description><![CDATA[<p>Darauf kannst du dich nicht verlassen. Auf MSVC++ sind wie erwartet sämtliche Werte undefiniert.</p>
<p>Meine Theorie: Der GCC implementiert den impliziten Basiskonstruktoraufruf so:</p>
<pre><code class="language-cpp">Y() : X()
{
   // ...
}
</code></pre>
<p>Wenn <code>X</code> als POD-Typ behandelt wird, muss es explizit mit der Klammerdarstellung initialisiert werden, damit die Member initialisiert sind:</p>
<pre><code class="language-cpp">X x = X();
</code></pre>
<p>Sonst, also so wie bei Folgendem, sind die Werte undefiniert.</p>
<pre><code class="language-cpp">X x;
</code></pre>
<p>Gleiches gilt auch für die Initialisierung der Basisklasse. Genau diese Behandlung als <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-194356.html" rel="nofollow">POD (Plain Old Data)</a> ist der Schlüssel.</p>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Wenn man selbst keinen Konstruktor angibt, generiert der Compiler einen Default-Konstruktor, der alle Member default-initialisiert (die Default-Initialisierung von int ist 0).</p>
</blockquote>
<p>Nein, das stimmt nicht, wie man auch schön an <code>X x;</code> sieht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770909</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:22:36 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:19:15 GMT]]></title><description><![CDATA[<p>DeepCopy schrieb:</p>
<blockquote>
<p>Und warum hat dann</p>
<pre><code>X::i //einen Zufallswert
</code></pre>
<p>aber</p>
<pre><code>Y::i //keinen ???, also 0
</code></pre>
<p>Das Y::i == 0 ist, habe ich mehrfach getestet, ist also kein Zufall.</p>
<p>Die Frage also lautet warum, gibt es ein X::i ein undefiniertes Verhalten, wie schon angemerkt (was ich auch erwartet habe), aber in X::i findet eine Initialisierung statt?</p>
</blockquote>
<p>Wer sagt denn, dass die 0 kein Zufall ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770910</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:19:15 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:21:10 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>DeepCopy schrieb:</p>
<blockquote>
<p>Wenn nun <strong>kein</strong> Default-Konstruktor in der Basis-Klasse X angegeben ist, wird das in der Y-Klasse geerbte Datenelement Y::i mit 0 initialisiert??? &lt;-- Warum?</p>
</blockquote>
<p>Wenn man selbst keinen Konstruktor angibt, generiert der Compiler einen Default-Konstruktor, der alle Member default-initialisiert (die Default-Initialisierung von int ist 0). Schreibst du den Default-Konstruktor selbst, bist du für's initialisieren der Member zuständig - da du das aber nicht machst, hat die Variable einen zufälligen Wert <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>
</blockquote>
<p>Der implizite Default-Ctor ist nach Standard äquivalent zu einem selbst implementierten Default-Ctor mit leerer Initialisierungsliste und leerem Rumpf.<br />
Da wird also gar nichts initialisiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770912</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:21:10 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:23:28 GMT]]></title><description><![CDATA[<p>Ohje ohje, da hatte ich aber gewaltiges Fehlwissen <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/1770914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770914</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:23:28 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:26:17 GMT]]></title><description><![CDATA[<p>Das Wichtige ist, zwischen <strong>POD-Typen</strong>, wie sie in C vorkommen (reine Sammlung von Daten), und &quot;tatsächlichen&quot; <strong>Klassen</strong> (mit Konstruktoren, Destruktor, Zuweisungsoperator als Funktionen) zu unterscheiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770916</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:26:17 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:32:17 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>DeepCopy schrieb:</p>
<blockquote>
<p>Wenn nun <strong>kein</strong> Default-Konstruktor in der Basis-Klasse X angegeben ist, wird das in der Y-Klasse geerbte Datenelement Y::i mit 0 initialisiert??? &lt;-- Warum?</p>
</blockquote>
<p>Wenn man selbst keinen Konstruktor angibt, generiert der Compiler einen Default-Konstruktor, der alle Member default-initialisiert (die Default-Initialisierung von int ist 0). Schreibst du den Default-Konstruktor selbst, bist du für's initialisieren der Member zuständig - da du das aber nicht machst, hat die Variable einen zufälligen Wert <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>
<p>edit: Stimmt alles nicht!</p>
</blockquote>
<p>Glaube ich nicht wirklich:</p>
<p>C++ Standard, 12.1.7 schrieb:</p>
<blockquote>
<p>The implicitly-defined default constructor performs the set of initializations of the class that would be performed by a user-written default constructor for that class <strong>with an empty mem-initializer-list</strong> (12.6.2) and an empty function body.</p>
</blockquote>
<p>Felix</p>
<p>EDIT: OK, viiiiiiiiiiiiiel zu langsam</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770920</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:32:17 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:46:42 GMT]]></title><description><![CDATA[<p>Also kurz und gut</p>
<p>Der GCC hat einen Initialisierungs-Bug in der Version 4.3.3, unter der Annahme das sich der MSVC++ korrekt verhält!</p>
<p>Es ist schon interessant das die Intitialisierung von i erst nach dem Aufruf des Basis-Konstruktors stattfindet, also (vor/beim) beim Aufruf des Abgeleiteten-Konstruktors.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Das mit dem POD habe ich nicht verstanden, was sind POD's (kann es sein das du <a href="http://en.wikipedia.org/wiki/Plain_old_data_structures" rel="nofollow">PODS</a> meinst) und welche Wirkung hätte denn Y y gegegenüber Y y = Y() bei der Initialisierung der Member?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770921</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770921</guid><dc:creator><![CDATA[DeepCopy]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:46:42 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:49:17 GMT]]></title><description><![CDATA[<p>DeepCopy schrieb:</p>
<blockquote>
<p>Der GCC hat einen Initialisierungs-Bug in der Version 4.3.3, unter der Annahme das sich der MSVC++ korrekt verhält!</p>
</blockquote>
<p>Kein Bug, aber es ist nicht garantiert, dass die Basisklasse initialisiert wird.</p>
<p>DeepCopy schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Das mit dem POD habe ich nicht verstanden, was sind POD's und welche Wirkung hätte denn Y y gegegenüber Y y = Y() bei der Initialisierung der Member?</p>
</blockquote>
<p>Bei Y spielt es keine Rolle, da es sich um einen Nicht-POD-Klassentyp handelt (ich verwende im folgenden den Begriff &quot;Klasse&quot; äquivalent zu &quot;Nicht-POD-Klasse&quot; - das ist aber <em>nicht</em> das Gleiche).</p>
<p>Plain-Old-Data-Typen haben eine etwas spezielle Behandlung, was Initialisierung betrifft (im Vergleich zu Klassen). Sie erfolgt analog zu den skalaren Typen wie <code>int</code> , <code>double</code> , <code>float*</code> .</p>
<pre><code class="language-cpp">// POD-Typ: für Definition siehe meinen Link im ersten Post
class MyPOD 
{
    long var;
};

// Einfache Definition initialisiert Werte NICHT.
int   a;
MyPOD b;

// temporäre Ausdrücke mit Klammer (Konstruktor-Syntax, aber
// kein Funktionsaufruf im Spiel) initialisieren Werte.
int();
MyPOD();

// Deklaration und Initialisierung mit Kopie initialisiert Werte.
int   c = int();
MyPOD d = MyPOD();
</code></pre>
<p>Das gleiche Verhalten hast du beim Initialisieren der Basisklasse.</p>
<pre><code class="language-cpp">// Klassentyp
class Derived : public MyPOD 
{
};

// Leerer Konstruktorrumpf: Basisklasse MyPOD muss nicht initialisiert
// werden, wenn sie ein POD ist. Falls die Basisklasse eine Nicht-POD-Klasse
// ist, wird der Standardkonstruktor aufgerufen. Dass der GCC hier auch bei
// PODs eine Initialisierung durchführt, ist implementierungsabhängig.
Derived::Derived()
{
}

// Explizite Initialisierung: Werte werden initialisiert.
Derived::Derived()
: MyPOD()
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1770930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770930</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:49:17 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:51:23 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Darauf kannst du dich nicht verlassen. Auf MSVC++ sind wie erwartet sämtliche Werte undefiniert.</p>
<p>Meine Theorie: Der GCC implementiert den impliziten Basiskonstruktoraufruf so:</p>
<pre><code class="language-cpp">Y() : X()
{
   // ...
}
</code></pre>
</blockquote>
<p>Verstehe ich nicht so ganz. Was ändert das denn?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770933</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:51:23 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 13:56:19 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Verstehe ich nicht so ganz. Was ändert das denn?</p>
</blockquote>
<p>Es gibt keinen Standardkonstruktor für PODs, folglich muss ein leerer Konstruktor der abgeleiteten Klasse keine Initialisierung der Basisklasse vornehmen, wenn dies nicht explizit getan wird.</p>
<p>Sonst steht in meinem oberen Post noch einiges...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1770936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770936</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 02 Sep 2009 13:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 15:16:14 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Der GCC hat einen Initialisierungs-Bug in der Version 4.3.3, unter der Annahme das sich der MSVC++ korrekt verhält!<br />
Kein Bug, aber es ist nicht garantiert, dass die Basisklasse initialisiert wird.</p>
</blockquote>
<p>Wie ich es schon mehrfach in vorherigen Posts gesagt habe, erwarte ich <strong>KEINE</strong> implizite Ininitalisierung meiner Member, insofern sehe ich die ungewollte Inititalisierung als einen GCC-Bug an.</p>
<p>Ich habe das mit den PODS verstanden explizit auch das meine Basis-Klasse ein POD-Typ ist (ähnlich anonymer union), was aber den Compiler nicht veranlassen sollte meine Member zu Inititalisieren.</p>
<p>Daher habe ich einen Test gemacht und die Funktion X::foo() als <strong>virtual</strong> deklariert und ich kann mir ein Schmunzeln nicht verkneifen.</p>
<p>Seht selbst:<br />
Geänderte Klasse X</p>
<pre><code class="language-cpp">class X
{
    public:
     int i;
     /** foo() jetzt virtual - und Klasse X kein POD-Typ mehr! **/
     virtual void foo() { cout &lt;&lt; &quot;X::foo() -&gt; X::i: &quot; &lt;&lt; i &lt;&lt; endl; }
};
</code></pre>
<p>Der Aufruf:</p>
<pre><code class="language-cpp">/** aufruf basis ohne eigenen default construktor **/
    cout &lt;&lt; &quot;X ohne eigenen Konstruktor&quot; &lt;&lt; endl;
    X x;
    X* px = &amp;x;
    px-&gt;foo();

    Y y;
    Y* py = &amp;y;
    py-&gt;foo();

    /** aufruf basis mit eigenem default construktor **/
    cout &lt;&lt; endl &lt;&lt; &quot;XA mit eigenem Konstruktor&quot; &lt;&lt; endl;
    XA xa;
    XA* pxa = &amp;xa;
    pxa-&gt;foo();

    cout &lt;&lt; endl;

    YA ya;
    YA* pya = &amp;ya;
    pya-&gt;foo();
</code></pre>
<p>Die Ausgabe:</p>
<pre><code>X ohne eigenen Konstruktor
X::foo() -&gt; X::i: 4196339 &lt;-- hier ist es jetzt richtig

Konstruktor Y ruft geerbtes X::i : 4197680 &lt;-- hier ist es jetzt auch richtig
Y::foo() -&gt; X::i: 4197680

XA mit eigenem Konstruktor
Konstruktor XA ruft XA::i : 631681712 &lt;-- hier ist noch richtig
XA::foo() -&gt; XA::i: 631681712

Konstruktor XA ruft XA::i : 0 &lt;-- aber jetzt kommts...
Konstruktor YA ruft geerbtes XA::i : 0
YA::foo() -&gt; XA::i: 0
</code></pre>
<p>YA wurde von XA abgeleitet, XA hat einen Konstruktor und ist <strong>kein</strong> POD-Typ!</p>
<p>Also wenn das nicht willkürlich ist, was dann...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a> : In jedem Fall gilt: Vielen Dank für deine Hilfe! <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/1770961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1770961</guid><dc:creator><![CDATA[DeepCopy]]></dc:creator><pubDate>Wed, 02 Sep 2009 15:16:14 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Wed, 02 Sep 2009 15:54:05 GMT]]></title><description><![CDATA[<p>Nachtrag <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>:</p>
<p>Ich habe deine Variante:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

class X
{
    public:
     int i;
       void foo() { cout &lt;&lt; &quot;X::foo() -&gt; X::i: &quot; &lt;&lt; i &lt;&lt; endl; }
};

int main()
{
  X x = X();
  return 0;
}
</code></pre>
<p>auf meine Klasse angewandt mit dem folgenden Compiler-Ergebnis:</p>
<pre><code>main.cpp|14|Fehler: redeclaration of »X x«|
</code></pre>
<p>dann kann also nicht sein was du im Post über den impliziten Basiskonstruktoraufruf geschrieben hast:</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Meine Theorie: Der GCC implementiert den impliziten Basiskonstruktoraufruf so:</p>
<pre><code class="language-cpp">Y() : X() // &lt;-- X x = X()
{
   // ...
}
</code></pre>
</blockquote>
<p>Und damit fällt natürlich auch der Klassen POD-Type aus.</p>
<p>Allerdings funktioniert es mit</p>
<pre><code class="language-cpp">int c = int(); // c == 0;
</code></pre>
<p><strong>Edit: War alles richtig was du gesagt hast, ich hatte noch eine alte x Definition in der main()-Funktion rumfliegen, sorry!</strong></p>
<p>Funktioniert ebenfalls!</p>
<pre><code class="language-cpp">X x = X(); // x.i == 0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1771004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1771004</guid><dc:creator><![CDATA[DeepCopy]]></dc:creator><pubDate>Wed, 02 Sep 2009 15:54:05 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Thu, 03 Sep 2009 01:30:45 GMT]]></title><description><![CDATA[<p>Ist jetzt alles klar, oder ist die Frage bezüglich scheinbar willkürlichem Verhalten von deinem vorletzten Post noch offen?</p>
<p>Falls noch offen: Kannst du dann nochmals nur den Codeteil, der dir merkwürdig vorkommt, posten? Ich habe ein wenig den Überblick verloren, da <code>XA</code> und <code>YA</code> jetzt ein neues Verhalten aufweisen, aber du keinen neuen Code (Klasse) dazu gezeigt hast...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1771251</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1771251</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 03 Sep 2009 01:30:45 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Thu, 03 Sep 2009 12:38:56 GMT]]></title><description><![CDATA[<p>Jetzt ist das mit den POD-Typen und deren speziellem Verhalten klar, danke.</p>
<p>Zum XA, YA Problem: Ich hatte &quot;NUR&quot; in der X Klasse foo() als virtual deklariert um zu erzwingen das eine:</p>
<pre><code>Y : X
</code></pre>
<p>Vererbung stattfindet und nicht</p>
<pre><code>Y() : X()
</code></pre>
<p>geändert hatte ich sonst nichts.</p>
<p>Bemerkenswert ist die Tatsache das sich das &quot;default&quot;-Verhalten von Zuständen innerhalb des Compilers herleiten lässt, auf die man als Programmierer keinen Einfluss hat.</p>
<p>Hier noch einmal der komplette Source (Achtung: foo() ist nicht virtual):</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;
/*** basis ohne eigenen default constructor ***/
class X
{
    public:
     int i;
//     virtual void foo() { cout &lt;&lt; &quot;X::foo() -&gt; X::i: &quot; &lt;&lt; i &lt;&lt; endl; }
       void foo() { cout &lt;&lt; &quot;X::foo() -&gt; X::i: &quot; &lt;&lt; i &lt;&lt; endl; }
};

class Y : public X
{
    public:
     Y() { cout &lt;&lt; &quot;Konstruktor Y ruft geerbtes X::i : &quot; &lt;&lt; i &lt;&lt; endl; }
     void foo() { cout &lt;&lt; &quot;Y::foo() -&gt; X::i: &quot; &lt;&lt; i &lt;&lt; endl; }
};

/*** basis mit eigenem default constructor ***/
class XA
{
    public:
     int i;
     XA() { cout &lt;&lt; &quot;Konstruktor XA ruft XA::i : &quot; &lt;&lt; i &lt;&lt; endl; }
     void foo() { cout &lt;&lt; &quot;XA::foo() -&gt; XA::i: &quot; &lt;&lt; i &lt;&lt; endl; }

};

class YA : public XA
{
    public:
     YA() { cout &lt;&lt; &quot;Konstruktor YA ruft geerbtes XA::i : &quot; &lt;&lt; i &lt;&lt; endl; }
     void foo() { cout &lt;&lt; &quot;YA::foo() -&gt; XA::i: &quot; &lt;&lt; i &lt;&lt; endl; }
};

int main()
{
    /** aufruf basis ohne eigenen default construktor **/
    cout &lt;&lt; &quot;X ohne eigenen Konstruktor&quot; &lt;&lt; endl;
    X x;
    X* px = &amp;x;
    px-&gt;foo();

    cout &lt;&lt; endl;

    Y y;
    Y* py = &amp;y;
    py-&gt;foo();

    /** aufruf basis mit eigenem default construktor **/
    cout &lt;&lt; endl &lt;&lt; &quot;XA mit eigenem Konstruktor&quot; &lt;&lt; endl;
    XA xa;
    XA* pxa = &amp;xa;
    pxa-&gt;foo();

    cout &lt;&lt; endl;

    YA ya;
    YA* pya = &amp;ya;
    pya-&gt;foo();

//    int c = int();
//    cout &lt;&lt; &quot;int c = int(), c: &quot; &lt;&lt; c &lt;&lt; endl;

    X xx = X(); // &lt;-- Dieser Aufruf ist auch als nicht POD-Type möglich, warum?

    cout &lt;&lt; endl &lt;&lt; &quot;X x = X(), x.i: &quot; &lt;&lt; xx.i &lt;&lt; endl;
    X xxx;
    cout &lt;&lt; endl &lt;&lt; &quot;X x, x.i: &quot; &lt;&lt; xxx.i &lt;&lt; endl;

    return 0;
}
</code></pre>
<p>Und das überraschende Output von heute (ohne virtuelles foo()):</p>
<pre><code>X ohne eigenen Konstruktor
X::foo() -&gt; X::i: 0 &lt;-- hat sich gegenüber letztem build geändert

Konstruktor Y ruft geerbtes X::i : 477025904 &lt;- ab hier wieder richtig
Y::foo() -&gt; X::i: 477025904 

XA mit eigenem Konstruktor
Konstruktor XA ruft XA::i : 625056888
XA::foo() -&gt; XA::i: 625056888

Konstruktor XA ruft XA::i : 0 &lt;-- hat sich gegenüber letztem build geändert
Konstruktor YA ruft geerbtes XA::i : 0 &lt;-- hat sich gegenüber letztem build geändert
YA::foo() -&gt; XA::i: 0

X x = X(), x.i: 0 &lt;-- Ok, ist POD-Typ 

X x, x.i: 625056576 &lt;-- richtiges verhalten
</code></pre>
<p>Und dasselbe Output von heute (mit virtuellem foo()):</p>
<pre><code>X ohne eigenen Konstruktor
X::foo() -&gt; X::i: 4197840 &lt;-- hier scheint es jetzt richtig (nicht POD-Type verhalten)

Konstruktor Y ruft geerbtes X::i : 4198022
Y::foo() -&gt; X::i: 4198022

XA mit eigenem Konstruktor
Konstruktor XA ruft XA::i : 0 &lt;-- sollte undefiniert sein (hat c_tor)
XA::foo() -&gt; XA::i: 0

Konstruktor XA ruft XA::i : -391481744 &lt;-- ab hier wieder richtig, warum???
Konstruktor YA ruft geerbtes XA::i : -391481744
YA::foo() -&gt; XA::i: -391481744

X x = X(), x.i: 0 &lt;-- jetzt kein POD-Typ laut Definition, warum ist POD-Type Initialisierung möglich?

X x, x.i: 65535 &lt;-- richtiges verhalten
</code></pre>
<p>Wie man sehen kann hat, verhält sich die Initialisierung Willkürlich, und ich meine Willkürlich, mal habe ich X::foo() ohne virtual übersetzt dann wieder mit, mal waren nur die Elemente der Objektinstanz XA mit 0 initialisiert, mal nur die Elemente der Objektinstanz YA, obwohl diese mit X nichts zu tun haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Ob X ein POD-Type ist oder nicht scheint bei der Initialisierung ebenfalls völlig belanglos zu sein.</p>
<p>Ich habe mal die Nacht darüber geschlafen und bin zu dem Schluss gekommen das der Compiler-Hersteller die Definition &quot;Nicht Initialisiert&quot; == &quot;Undefiniert&quot; == &quot;Willkürlich&quot; gesetzt hat, und somit es dem GCC Compiler freisteht bei &quot;Undefiniertem Verhalten&quot; zu initialisieren oder auch nicht.</p>
<p><strong>Fazit: Mit den C++ Compiler Herstellern ist es wie mit der Politik - sie können viele Standards versprechen, müssen sich aber letztendlich nicht wirklich daran halten.</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1771512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1771512</guid><dc:creator><![CDATA[DeepCopy]]></dc:creator><pubDate>Thu, 03 Sep 2009 12:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Thu, 03 Sep 2009 12:48:07 GMT]]></title><description><![CDATA[<p>DeepCopy schrieb:</p>
<blockquote>
<p>Wie man sehen kann hat, verhält sich die Initialisierung Willkürlich, und ich meine Willkürlich, mal habe ich X::foo() ohne virtual übersetzt dann wieder mit, mal waren nur die Elemente der Objektinstanz XA mit 0 initialisiert, mal nur die Elemente der Objektinstanz YA, obwohl diese mit X nichts zu tun haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Wie kommst du darauf, dass der Wert 0 zwingend die Folge einer Initialisierung dieses Objektes ist?</p>
<p>&quot;indeterminate&quot; heißt eben nicht: &quot;irgendein von 0 verschiedener zufälliger Wert&quot;,<br />
sondern &quot;irgendein Wert&quot;. Dabei kann dieser Wert in Abhängigkeit von der Implementation durchaus wohlbestimmt sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1771530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1771530</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 03 Sep 2009 12:48:07 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Thu, 03 Sep 2009 13:08:23 GMT]]></title><description><![CDATA[<p>Gut, da diese Antwort jetzt schon öfters vorgekommen ist, wie hoch schätzt du die Wahrscheinlichkeit ein, bei 2^31 Möglichkeiten immer wieder (beim Rebuild und Neustart) eine 0 (an festen aber irgendwie willkürlichen Positionen) in deinen Daten-Membern zu erhalten, ein aktives BS vorausgesetzt.</p>
<p>Es sollte kein &quot;Zufall&quot; sein, genauso wenig wie 10 mal 6 Richtige im Lotto hintereinander.</p>
<p>camper schrieb:</p>
<blockquote>
<p>...Dabei kann dieser Wert in Abhängigkeit von der Implementation durchaus wohlbestimmt sein.</p>
</blockquote>
<p>Heißt dann &quot;indeterminate&quot; ? &quot;Mal Vorbestimmt&quot; : &quot;Mal Nicht Vorbestimmt&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1771538</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1771538</guid><dc:creator><![CDATA[DeepCopy]]></dc:creator><pubDate>Thu, 03 Sep 2009 13:08:23 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Thu, 03 Sep 2009 13:02:11 GMT]]></title><description><![CDATA[<p>DeepCopy schrieb:</p>
<blockquote>
<p>Gut, da diese Antwort jetzt schon öfters vorgekommen ist, wie hoch schätzt du die Wahrscheinlichkeit ein, bei 2^31 Möglichkeiten immer wieder (beim Rebuild und Neustart) eine 0 (je nach Wetter und Wind) in deinen Daten-Membern zu erhalten, ein aktives BS vorausgesetzt.</p>
<p>Es kann unmöglich &quot;Zufall&quot; sein, genauso wenig wie 10 mal 6 Richtige im Lotto hintereinander.</p>
</blockquote>
<p>Es hat auch niemand von Zufall gesprochen. Das warst du alleine. VC macht bei den Debug Builds, wenn keinen explizite Initialisierung statt findet eine 0 Initialisierung. Bei Release sind das dann zufällige Zahlen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1771541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1771541</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 03 Sep 2009 13:02:11 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Thu, 03 Sep 2009 13:02:52 GMT]]></title><description><![CDATA[<p>DeepCopy schrieb:</p>
<blockquote>
<p>Es kann unmöglich &quot;Zufall&quot; sein, genauso wenig wie 10 mal 6 Richtige im Lotto hintereinander.</p>
</blockquote>
<p>Du vergisst hier einen sehr entscheidenden Punkt: Nicht initialisierte Werte sind <strong>nicht</strong> zufällig, nicht einmal pseudo-zufällig. Sie entsprechen wichtigen Kriterien wie Gleichverteilung und geringe Korrelation voneinander <strong>nicht</strong>.</p>
<p>Es spielt eine Rolle, was vorher an dieser Stelle im Speicher gestanden hat. Da 0 ein sehr oft vorkommender Wert ist (gerade bei Default-Initialisierung), beträgt die Wahrscheinlichkeit durchaus mehr als 2^-31.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1771542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1771542</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 03 Sep 2009 13:02:52 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Thu, 03 Sep 2009 13:08:01 GMT]]></title><description><![CDATA[<p>DeepCopy schrieb:</p>
<blockquote>
<p>Gut, da diese Antwort jetzt schon öfters vorgekommen ist, wie hoch schätzt du die Wahrscheinlichkeit ein, bei 2^31 Möglichkeiten immer wieder (beim Rebuild und Neustart) eine 0 in deinen Daten-Membern zu erhalten, ein aktives BS vorausgesetzt.</p>
<p>Es kann unmöglich &quot;Zufall&quot; sein, genauso wenig wie 10 mal 6 Richtige im Lotto hintereinander.</p>
</blockquote>
<p>Stimmt, und damit beweist du nur, dass du nicht genau genug gelesen hast.<br />
Ich schreib es nochmal<br />
Wie kommst du darauf, dass der Wert 0 zwingend die Folge einer Initialisierung <em><strong>dieses</strong></em> Objektes ist?<br />
In einem üblichen Programm finden bereits vor Aufruf von main eine Menge Operationen statt. Sicherlich hinterlassen diese Operationen den Stack (in dem dann in main dein Objekte erstellt werden) nicht in einem völlig zufälligen Zustand?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1771550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1771550</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 03 Sep 2009 13:08:01 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Thu, 03 Sep 2009 13:28:08 GMT]]></title><description><![CDATA[<p>Ihr seit aber verdammt schnell, ich hatte meinen Post noch gar nicht fertig geschrieben.</p>
<p>Aber Ok: Ich weiß worauf Ihr hinaus wollt, das es durch aus sein kann das an betimmten Positionen im Speicher 0 initialisierungen Vorliegen können. Auf diese verweisen dann die Datenelemente der Klasse.</p>
<p>Das habe ich mir auch schon so gedacht, aber dieses Verhalten lässt sich reproduzieren, und das macht mir Kopfzerbrechen.</p>
<p>In erster Linie ging es mir auch um das Problem das Nexus mir mit den PODS vermittelt hat, und dieses Verhalten scheint mir mal gegeben zu sein und mal nicht.</p>
<p>camper schrieb:</p>
<blockquote>
<p>Stimmt, und damit beweist du nur, dass du nicht genau genug gelesen hast.</p>
</blockquote>
<p>Da hast du recht, das hatte ich in der Tat, danke für deinen Hinweis, sorry falls es so aussah als wollte ich dich kritisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1771555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1771555</guid><dc:creator><![CDATA[DeepCopy]]></dc:creator><pubDate>Thu, 03 Sep 2009 13:28:08 GMT</pubDate></item><item><title><![CDATA[Reply to Defaultkonstruktor der Basisklasse hat seltsames Verhalten on Thu, 03 Sep 2009 13:48:41 GMT]]></title><description><![CDATA[<p>Ich denke das Problem war tatsächlich der &quot;Pseudo&quot;-Zufällige Speicher, nach dem nochmaligen Eruieren des Outputs und unter Beachtung des bisherig erlerntem kann man fast mit Sicherheit sagen das es sich um das angesprochene Phänomen handelt.</p>
<p>Ich bedanke mich bei Allen die zur Lösung beigetragen haben (besonders Nexus u. camper). <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/1771591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1771591</guid><dc:creator><![CDATA[DeepCopy]]></dc:creator><pubDate>Thu, 03 Sep 2009 13:48:41 GMT</pubDate></item></channel></rss>