<?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[Klassen-Paradoxon]]></title><description><![CDATA[<p>schönen guten Tag alle zusammen.<br />
ich hänge schon seit einer Weile an einem aus meiner Sicht eigenartigen Problem rum.<br />
habe dieses auf das Nötigste reduzierz und unten gepostet.</p>
<p>kurze Erläuterung:<br />
habe zwei Klassen geschrieben (Klasse_Eins und Klassse_Zwei).<br />
Klasse_Zwei enthält nur zwei Objekte von Klasse_Eins(wie man unten alles sieht).</p>
<p>mir ist unklar, warum das objekt x die gleichen Werte in a hat wie y.<br />
dabei wird für x niemals der 2.Konstruktor der Klasse_Zwei aufgerufen.</p>
<p>übrigens: wenn ich in &quot;test3.cpp&quot; die zeilen 31 und 32 vertausche passiert das nicht.</p>
<p>ganz unten poste ich mal die Ausgabe der main.</p>
<p>ich selber bin Student. kenne mich also in der Matarie etwas aus. doch blicke hier nicht durch. wenn einer eine schlau Erklärung hat, wäre ich echt dankbar.</p>
<p>Datei &quot;test.cpp&quot;</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;test3.cpp&quot;

using namespace std;

int main()
{
    Klasse_Zwei obj(8);

    for(int i=0;i&lt;5;i++)
            cout&lt;&lt;obj.x.a[i]&lt;&lt;endl;

    cout&lt;&lt;endl;

    for(int i=0;i&lt;5;i++)
            cout&lt;&lt;obj.y.a[i]&lt;&lt;endl;

    cin.get();
}
</code></pre>
<p>Datei &quot;test3.cpp&quot;</p>
<pre><code class="language-cpp">#ifndef _TEST_H
#define _TEST_H

#include &lt;iostream&gt;

using namespace std;

class Klasse_Eins
{
      private:
      public:
             int a[5];

             Klasse_Eins(){cout&lt;&lt;&quot;hier wird 1.Konstruktor aufgerufen!&quot;&lt;&lt;endl;};
             Klasse_Eins(int wert)
             {
                             cout&lt;&lt;&quot;hier wird 2.Konstruktor aufgerufen!&quot;&lt;&lt;endl;
                             for(int i=0;i&lt;5;i++)a[i]=i*wert;
             }
};

class Klasse_Zwei
{
      private:
      public:
             Klasse_Eins x,y;

             //Konstruktor
             Klasse_Zwei(int wert)
             {
                             y=Klasse_Eins(wert);
                             x=Klasse_Eins();
             }

};
#endif
</code></pre>
<p>Ausgabe der main()<br />
**<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 2.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
0<br />
8<br />
16<br />
24<br />
32</p>
<p>0<br />
8<br />
16<br />
24<br />
32<br />
**</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268160/klassen-paradoxon</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 00:14:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268160.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 Jun 2010 07:40:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassen-Paradoxon on Sat, 05 Jun 2010 07:40:24 GMT]]></title><description><![CDATA[<p>schönen guten Tag alle zusammen.<br />
ich hänge schon seit einer Weile an einem aus meiner Sicht eigenartigen Problem rum.<br />
habe dieses auf das Nötigste reduzierz und unten gepostet.</p>
<p>kurze Erläuterung:<br />
habe zwei Klassen geschrieben (Klasse_Eins und Klassse_Zwei).<br />
Klasse_Zwei enthält nur zwei Objekte von Klasse_Eins(wie man unten alles sieht).</p>
<p>mir ist unklar, warum das objekt x die gleichen Werte in a hat wie y.<br />
dabei wird für x niemals der 2.Konstruktor der Klasse_Zwei aufgerufen.</p>
<p>übrigens: wenn ich in &quot;test3.cpp&quot; die zeilen 31 und 32 vertausche passiert das nicht.</p>
<p>ganz unten poste ich mal die Ausgabe der main.</p>
<p>ich selber bin Student. kenne mich also in der Matarie etwas aus. doch blicke hier nicht durch. wenn einer eine schlau Erklärung hat, wäre ich echt dankbar.</p>
<p>Datei &quot;test.cpp&quot;</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;test3.cpp&quot;

using namespace std;

int main()
{
    Klasse_Zwei obj(8);

    for(int i=0;i&lt;5;i++)
            cout&lt;&lt;obj.x.a[i]&lt;&lt;endl;

    cout&lt;&lt;endl;

    for(int i=0;i&lt;5;i++)
            cout&lt;&lt;obj.y.a[i]&lt;&lt;endl;

    cin.get();
}
</code></pre>
<p>Datei &quot;test3.cpp&quot;</p>
<pre><code class="language-cpp">#ifndef _TEST_H
#define _TEST_H

#include &lt;iostream&gt;

using namespace std;

class Klasse_Eins
{
      private:
      public:
             int a[5];

             Klasse_Eins(){cout&lt;&lt;&quot;hier wird 1.Konstruktor aufgerufen!&quot;&lt;&lt;endl;};
             Klasse_Eins(int wert)
             {
                             cout&lt;&lt;&quot;hier wird 2.Konstruktor aufgerufen!&quot;&lt;&lt;endl;
                             for(int i=0;i&lt;5;i++)a[i]=i*wert;
             }
};

class Klasse_Zwei
{
      private:
      public:
             Klasse_Eins x,y;

             //Konstruktor
             Klasse_Zwei(int wert)
             {
                             y=Klasse_Eins(wert);
                             x=Klasse_Eins();
             }

};
#endif
</code></pre>
<p>Ausgabe der main()<br />
**<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 2.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
0<br />
8<br />
16<br />
24<br />
32</p>
<p>0<br />
8<br />
16<br />
24<br />
32<br />
**</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907125</guid><dc:creator><![CDATA[astro108]]></dc:creator><pubDate>Sat, 05 Jun 2010 07:40:24 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Paradoxon on Sat, 05 Jun 2010 07:46:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Klasse_Zwei(int wert)
 : y(wert)
{
}
</code></pre>
<p>Warum? Member werden vor dem Eintritt in den Konstruktorbody initialisiert, damit du dort auch darauf zugreifen kannst. Um diese Initialisierung selber in die Hand zu nehemen, (also die Default-Initialisierung zu vermeiden) gibt es die Initialisierungsliste.</p>
<p>BTW: .cpp-Dateien sind Implementierungsdateien. Diese werden kompiliert und nicht includiert. Wenn du Namen in einer anderen Übersetzungseinheit bekannt geben willst, nutze Header.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907132</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 05 Jun 2010 07:46:12 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Paradoxon on Sat, 05 Jun 2010 09:23:19 GMT]]></title><description><![CDATA[<p>Die Aussage von l'abra d'or ist zwar korrekt, beantwortet aber wohl deine Frage nicht...</p>
<p>Ich fand deine Behauptung erstmal etwas komisch und hab es bei mir durch<br />
den Compiler gejagt:</p>
<p>Ausgabe:</p>
<pre><code>0
0
-1073743488
-1073743388
0

0
8
16
24
32
</code></pre>
<p>Jetzt zur Erklärung, warum das bei dir (wahrscheinlich) so ist...</p>
<p>Ein Array als member besitzt ja wie du sicherlich weißt die Werte, die<br />
gerade (zufällig) im Speicher sind.</p>
<p>In Zeile 31 legst du ein Objekt auf dem Stack an mit 0 8 16 24 32<br />
Der Inhalt dieses Objektes wird dann durch den operator= in dein Member y<br />
kopiert.<br />
In Zeile 32 legst du ein weiteres Objekt auf dem Stack, das (soweit meine Vermutung) genau die gleiche Adresse hat wie das zuvor. Dort steht also<br />
noch der Inhalt 0 8 16 24 32 in dem Speicherbereich für a drin.<br />
Der Inhalt dieses Objektes wird dann durch den operator= in dein Member x<br />
kopiert.</p>
<p>Tada... Beide haben die gleichen Werte <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>
<p>Aber generell gebe ich l'abra d'or recht: Initialisierungsliste ist hier mehr als sinnvoll....</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907158</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 05 Jun 2010 09:23:19 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Paradoxon on Sat, 05 Jun 2010 09:37:45 GMT]]></title><description><![CDATA[<p>Ah, wunderbar, jetzt ist mir auch das Problem klar <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="😃"
    /> Hab mir den Post durchgelesen und bei der Länge einfach die Frage nicht gefunden.<br />
Ich dachte es geht ihm darum, dass da erst &quot;Konstruktor 1&quot; steht, obwohl er &quot;Konstruktor 2&quot; aufruft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907163</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 05 Jun 2010 09:37:45 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Paradoxon on Sat, 05 Jun 2010 09:57:41 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Ah, wunderbar, jetzt ist mir auch das Problem klar <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="😃"
    /> Hab mir den Post durchgelesen und bei der Länge einfach die Frage nicht gefunden.<br />
Ich dachte es geht ihm darum, dass da erst &quot;Konstruktor 1&quot; steht, obwohl er &quot;Konstruktor 2&quot; aufruft.</p>
</blockquote>
<p>Hab ich aber auch erst gedacht und wollte das Posting schon als beantwortet<br />
einordnen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1907176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907176</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 05 Jun 2010 09:57:41 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Paradoxon on Sat, 05 Jun 2010 13:00:14 GMT]]></title><description><![CDATA[<p>Ja, vielen Dank erst mal.<br />
das mit der Initialisierungsliste hat echt mein Problem gelöst.</p>
<blockquote>
<p>In Zeile 32 legst du ein weiteres Objekt auf dem Stack, das (soweit meine Vermutung) genau die gleiche Adresse hat wie das zuvor.</p>
</blockquote>
<p>meine Frage kann ich denke ich mal erwas vertiefen:<br />
warum hat das neue Objekt denn die gleiche Adresse?</p>
<p>genau genommen kann dies doch gar nicht sein.<br />
ich habe mal dieses test-program etwas erweitert und in der main noch die Adresse der Objekte ausgeben lassen.</p>
<p>wie ihr sehen könnt sind die Adressen gar nicht gleich (ganz unten die Ausgabe).</p>
<p>was wir jedoch beobachten können ist, dass die Adressen der Objekte zwar verschieden sind doch sie gleich initialisiert werden.<br />
und das interessante ist, dass es für alle fünf Objekte der Fall ist.</p>
<p>also wie gesagt, mein Problem konnte ich umgehen.<br />
doch was da passiert kann ich mir nicht ganz erklären.</p>
<p>Datei &quot;test.cpp&quot;:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &quot;test3.cpp&quot;

using namespace std;

int main()
{
    Klasse_Zwei obj(8);

    cout&lt;&lt;&amp;obj.x&lt;&lt;endl;

    for(int i=0;i&lt;5;i++)
            cout&lt;&lt;obj.x.a[i]&lt;&lt;endl;
    cout&lt;&lt;endl;

    cout&lt;&lt;&amp;obj.y&lt;&lt;endl;
    for(int i=0;i&lt;5;i++)
            cout&lt;&lt;obj.y.a[i]&lt;&lt;endl;
    cout&lt;&lt;endl;

    cout&lt;&lt;&amp;obj.z&lt;&lt;endl;
    for(int i=0;i&lt;5;i++)
            cout&lt;&lt;obj.z.a[i]&lt;&lt;endl;
    cout&lt;&lt;endl;

    cout&lt;&lt;&amp;obj.v&lt;&lt;endl;
    for(int i=0;i&lt;5;i++)
            cout&lt;&lt;obj.v.a[i]&lt;&lt;endl;
    cout&lt;&lt;endl;

    cout&lt;&lt;&amp;obj.w&lt;&lt;endl;
    for(int i=0;i&lt;5;i++)
            cout&lt;&lt;obj.w.a[i]&lt;&lt;endl;

    cin.get();
}
</code></pre>
<p>Datei &quot;test3.cpp&quot;:</p>
<pre><code class="language-cpp">#ifndef _TEST_H
#define _TEST_H

#include &lt;iostream&gt;

using namespace std;

class Klasse_Eins
{
      private:
      public:
             int a[5];

             Klasse_Eins(){cout&lt;&lt;&quot;hier wird 1.Konstruktor aufgerufen!&quot;&lt;&lt;endl;};
             Klasse_Eins(int wert)
             {
                             cout&lt;&lt;&quot;hier wird 2.Konstruktor aufgerufen!&quot;&lt;&lt;endl;
                             for(int i=0;i&lt;5;i++)a[i]=i*wert;
             }
};

class Klasse_Zwei
{
      private:
      public:
             Klasse_Eins x,y,z,v,w;
             Klasse_Zwei(int wert)
             {
                             y=Klasse_Eins(wert);
                             x=Klasse_Eins();
                             z=Klasse_Eins();
                             v=Klasse_Eins();
                             w=Klasse_Eins();
             }

};
#endif
</code></pre>
<p>Ausgabe der main()<br />
**<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 2.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
hier wird 1.Konstruktor aufgerufen!<br />
0x22ff00<br />
0<br />
8<br />
16<br />
24<br />
32</p>
<p>0x22ff14<br />
0<br />
8<br />
16<br />
24<br />
32</p>
<p>0x22ff28<br />
0<br />
8<br />
16<br />
24<br />
32</p>
<p>0x22ff3c<br />
0<br />
8<br />
16<br />
24<br />
32</p>
<p>0x22ff50<br />
0<br />
8<br />
16<br />
24<br />
32<br />
**</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907299</guid><dc:creator><![CDATA[astro108]]></dc:creator><pubDate>Sat, 05 Jun 2010 13:00:14 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Paradoxon on Sat, 05 Jun 2010 13:16:22 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24465">@astro108</a>, es geht um die Adressen der temporären, namenlosen Objekte in Klasse_Zwei(int).</p>
<p>Um die zu sehen müsstest du &quot;this&quot; in Klasse_Eins() und Klasse_Eins(int) ausgeben lassen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907303</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 05 Jun 2010 13:16:22 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Paradoxon on Sat, 05 Jun 2010 13:20:26 GMT]]></title><description><![CDATA[<p>Die Sache ist anders gemeint. Nicht x,y haben die Selbe Adresse, sondern die temporären Objekte die du erzeugst:</p>
<pre><code class="language-cpp">Klasse_Zwei(int wert)
             {
                             y=Klasse_Eins(wert);  // 1)
                             x=Klasse_Eins();      // 2)
                             z=Klasse_Eins();
                             v=Klasse_Eins();
                             w=Klasse_Eins();
             }
</code></pre>
<p>Bei 1) erzeugt Klasse_Eins(wert) ein temporäres Objekt. x,y,z,v,w sind schon initialisiert. Das temporäre Objekt wird y zugewiesen und danach wieder zerstört. Der Stack hat jetzt aber evtl. schon Werte rumliegen. Jetzt erzeugst du in 2) (und den folgenden Zeilen) wieder temporäre Objekte, die genau da liegen, wo das temp. Objekt aus 1) gelegen hat. Da das Member-Array nicht explizit initialisiert wird, kann es durchaus sein, dass es die Werte, die schon im Speicher liegen, direkt annimmt. Das ist aber reiner Zufall wenn es funktioniert und sollte nicht verwendet werden. Immer alles, worauf du dich verlassen willst, selber initialisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907307</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 05 Jun 2010 13:20:26 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Paradoxon on Sat, 05 Jun 2010 14:16:06 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>, ja in der tat. hab das ausgeben lassen, was du gesagt hast und die adressen auf dem Stack sind die gleichen.</p>
<p>bin auch einverstanden, dass es eher Zufall ist. Doch eigenartig, dass dieser Zufall so ausnahmslos auftritt. ich dem Projekt, an dem ich gerade dransitze hatte ich dieses &quot;Phänomen&quot; mit durchaus komplexeren Klassen als den trivialen hier.</p>
<p>aber gut ich denke mal, dass der reservierte Stack einfach nicht überschrieben wurde.</p>
<p>auf jeden fall danke ich euch und betrachte das Problem für mich als erledigt <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/1907329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907329</guid><dc:creator><![CDATA[astro108]]></dc:creator><pubDate>Sat, 05 Jun 2010 14:16:06 GMT</pubDate></item><item><title><![CDATA[Reply to Klassen-Paradoxon on Sun, 06 Jun 2010 05:14:53 GMT]]></title><description><![CDATA[<p>astro108 schrieb:</p>
<blockquote>
<p>bin auch einverstanden, dass es eher Zufall ist. Doch eigenartig, dass dieser Zufall so ausnahmslos auftritt. ich dem Projekt, an dem ich gerade dransitze hatte ich dieses &quot;Phänomen&quot; mit durchaus komplexeren Klassen als den trivialen hier.</p>
</blockquote>
<p>Naja...</p>
<p>Ist ja nicht wirklich Zufall. Dein Compiler nimmt sich halt immer die nächste<br />
verfügbare Stackadresse. Da das Objekt davor nicht mehr erreichtbar ist, kann<br />
er diese halt wieder verwenden. Alles andere wäre Verschwendung.<br />
Mein Compiler optimert evtl. etwas, so dass er gleich das Objekt gleich auf dem<br />
Heap verwendet. (Ist aber nur ne Vermutung mit der Optimierung)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907571</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 06 Jun 2010 05:14:53 GMT</pubDate></item></channel></rss>