<?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[Konstruktor-Aufruf]]></title><description><![CDATA[<p>Also folgender Codeschnipsel erstmal</p>
<pre><code class="language-cpp">class tDatum
{
public:
    int Tag;
    int Monat;
    int Jahr;

    tDatum() // Default-Konstruktor
    {
        Tag = 1;
        Monat = 1;
        Jahr = 1970;
        cout &lt;&lt; &quot;Konstruktor wurde aufgerufen!&quot; &lt;&lt; endl;
    }
};
</code></pre>
<p>Soweit ja total simpel. Eine einfache Klasse mit einem Konstruktor.</p>
<pre><code class="language-cpp">int main()
{
    tDatum meinDatum;
}
</code></pre>
<p>Das ist auch noch total simpel. Ein Objekt der Klasse tDatum wird angelegt, der Konstruktor aufgerufen und fertig.</p>
<p>So jetzt kommt aber der Teil mit der Frage.</p>
<pre><code class="language-cpp">int main()
{
    tDatum *irgendwann;
    // irgendwann = new tDatum;
    (*irgendwann).Tag = 10;
}
</code></pre>
<p>Erstmal vorweg, ich habe die Zeile mit 'new' absichtlich rausgenommen.</p>
<p>Jetzt die Frage: Wieso kann ich auf das Element Tag zugreifen obwohl das Objekt noch garnicht richtig initialisiert wurde (der Konstruktor wird nicht aufgerufen)?</p>
<p>Bzw. was passiert genau in der Zeile wo der Zeiger angelegt wird?</p>
<pre><code class="language-cpp">tDatum *irgendwann;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/129531/konstruktor-aufruf</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 07:28:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/129531.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Dec 2005 13:22:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 13:22:03 GMT]]></title><description><![CDATA[<p>Also folgender Codeschnipsel erstmal</p>
<pre><code class="language-cpp">class tDatum
{
public:
    int Tag;
    int Monat;
    int Jahr;

    tDatum() // Default-Konstruktor
    {
        Tag = 1;
        Monat = 1;
        Jahr = 1970;
        cout &lt;&lt; &quot;Konstruktor wurde aufgerufen!&quot; &lt;&lt; endl;
    }
};
</code></pre>
<p>Soweit ja total simpel. Eine einfache Klasse mit einem Konstruktor.</p>
<pre><code class="language-cpp">int main()
{
    tDatum meinDatum;
}
</code></pre>
<p>Das ist auch noch total simpel. Ein Objekt der Klasse tDatum wird angelegt, der Konstruktor aufgerufen und fertig.</p>
<p>So jetzt kommt aber der Teil mit der Frage.</p>
<pre><code class="language-cpp">int main()
{
    tDatum *irgendwann;
    // irgendwann = new tDatum;
    (*irgendwann).Tag = 10;
}
</code></pre>
<p>Erstmal vorweg, ich habe die Zeile mit 'new' absichtlich rausgenommen.</p>
<p>Jetzt die Frage: Wieso kann ich auf das Element Tag zugreifen obwohl das Objekt noch garnicht richtig initialisiert wurde (der Konstruktor wird nicht aufgerufen)?</p>
<p>Bzw. was passiert genau in der Zeile wo der Zeiger angelegt wird?</p>
<pre><code class="language-cpp">tDatum *irgendwann;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/941945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941945</guid><dc:creator><![CDATA[Doktor Ruff]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:22:03 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 13:27:31 GMT]]></title><description><![CDATA[<p>Doktor Ruff schrieb:</p>
<blockquote>
<p>Jetzt die Frage: Wieso kann ich auf das Element Tag zugreifen obwohl das Objekt noch garnicht richtig initialisiert wurde (der Konstruktor wird nicht aufgerufen)?</p>
</blockquote>
<p>kannst du nicht; rein syntaktisch gesehen greifst du auf Tag zu (bzw. auf den speicher, den Tag belegen würde, wenn dort ein ensprechendes objekt wäre) - allerdings benutzt du hier einen nicht initialisierten pointer, und das ist UB (undefiniertes verhalten - es kann alles passieren).</p>
<blockquote>
<p>Bzw. was passiert genau in der Zeile wo der Zeiger angelegt wird?</p>
<pre><code class="language-cpp">tDatum *irgendwann;
</code></pre>
</blockquote>
<p>du erhälst einen nicht initialisierten pointer. das einzige was du damit machen darfst, ist ihm etwas zuzuweisen - alles andere ist UB (richtig, du darfst ihn nicht einmal kopieren).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941952</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:27:31 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 13:28:43 GMT]]></title><description><![CDATA[<p>irgendwann ist ersteinmal ein Zeiger auf eine Speicheradresse. Da es in C(++) keine Laufzeitprüfung für sowas gibt, kannst Du mit diesem Zeiger arbeiten. Sollst Du aber nicht.</p>
<p>Ein Zeiger wird gültig wenn man ihm die Adresse eines neu erzeugten (new) oder bereits existierenden (&amp;objekt) Objekts zuteilt.</p>
<p>Nichtsdestotrotz kannst Du mit einem Zeiger immer arbeiten, nur dass er uninitialisiert auf Speicher verweist der Dir nicht gehört. Wenn &quot;irgendwann&quot; vom Compiler mit 0 initialisiert wurde, und Du greifst auf den zweiten int-Wert zu dann liest Du damit Adresse 0x8...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941953</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:28:43 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 13:28:48 GMT]]></title><description><![CDATA[<p>Im 2. Fall hast Du nur einen Pointer. Es wird kein Objekt angelegt. Deshalb kein Konstruktor Aufruf. Der Pointer zeigt irgendwo hin. Die 10 Schreibst Du also irgendwo hin. Dein Programm ist aber in keinem definiertem Zustand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941954</guid><dc:creator><![CDATA[freer]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:28:48 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 13:29:13 GMT]]></title><description><![CDATA[<blockquote>
<p>Jetzt die Frage: Wieso kann ich auf das Element Tag zugreifen obwohl das Objekt noch garnicht richtig initialisiert wurde (der Konstruktor wird nicht aufgerufen)?</p>
</blockquote>
<p>Kannst du nicht. Du hast kein Objekt sondern nur einen Zeiger, der ins Nirvana zeigt. Dereferenzierst du diesen (was du tust), führt das zu undefiniertem Verhalten. Es kann also letztlich alles passieren. Vom GPC bis zum Totalabsturz. Es können auch Nasenkobolde fliegen. Bei gutem Wetter kann aber auch mal scheinbar alles &quot;richtig&quot; funktionieren.</p>
<p>Entscheidend ist, dass der von dir gepostete Code kein legales C++ ist, da du auf ein nichtexistierendes Objekt zugreifst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941956</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:29:13 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 13:30:00 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Doktor Ruff schrieb:</p>
<blockquote>
<p>Jetzt die Frage: Wieso kann ich auf das Element Tag zugreifen obwohl das Objekt noch garnicht richtig initialisiert wurde (der Konstruktor wird nicht aufgerufen)?</p>
</blockquote>
<p>kannst du nicht; rein syntaktisch gesehen greifst du auf Tag zu (bzw. auf den speicher, den Tag belegen würde, wenn dort ein ensprechendes objekt wäre) - allerdings benutzt du hier einen nicht initialisierten pointer, und das ist UB (undefiniertes verhalten - es kann alles passieren).</p>
<blockquote>
<p>Bzw. was passiert genau in der Zeile wo der Zeiger angelegt wird?</p>
<pre><code class="language-cpp">tDatum *irgendwann;
</code></pre>
</blockquote>
<p>du erhälst einen nicht initialisierten pointer. das einzige was du damit machen darfst, ist ihm etwas zuzuweisen - alles andere ist UB (richtig, du darfst ihn nicht einmal kopieren).</p>
</blockquote>
<p>Aso! Ich habe mich nämlich total gewundert, als der Compiler nicht gemeckert hat als ich die Zeile mit 'new' weggelassen habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941958</guid><dc:creator><![CDATA[Doktor Ruff]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:30:00 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 13:37:44 GMT]]></title><description><![CDATA[<p>HumeSikkins schrieb:</p>
<blockquote>
<blockquote>
<p>Jetzt die Frage: Wieso kann ich auf das Element Tag zugreifen obwohl das Objekt noch garnicht richtig initialisiert wurde (der Konstruktor wird nicht aufgerufen)?</p>
</blockquote>
<p>Kannst du nicht. Du hast kein Objekt sondern nur einen Zeiger, der ins Nirvana zeigt. Dereferenzierst du diesen (was du tust), führt das zu undefiniertem Verhalten. Es kann also letztlich alles passieren. Vom GPC bis zum Totalabsturz. Es können auch Nasenkobolde fliegen. Bei gutem Wetter kann aber auch mal scheinbar alles &quot;richtig&quot; funktionieren.</p>
<p>Entscheidend ist, dass der von dir gepostete Code kein legales C++ ist, da du auf ein nichtexistierendes Objekt zugreifst.</p>
</blockquote>
<p><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="😃"
    /> <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="😃"
    /> <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>Also sehe ich das richtig, dass man solche Konstrukte auch wenn das Objekt richtig initialisiert wurde vermeiden sollte wegen der Fehleranfälligkeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/941973</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941973</guid><dc:creator><![CDATA[Doktor Ruff]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:37:44 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 13:51:21 GMT]]></title><description><![CDATA[<p>Also im alltäglichen Ablauf wirst Du um solche Konstrukte nicht drumherumkommen, aber Du solltest eben drauf achten dass Zeiger immer initialisiert werden und später auch wieder gelöscht <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>Ja, bei C++ handelt der Programmierer noch eigenverantwortlich!! <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/941993</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/941993</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 14 Dec 2005 13:51:21 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 14:42:02 GMT]]></title><description><![CDATA[<p>Auf jeden Fall zumindest folgendes angewöhnen:</p>
<pre><code class="language-cpp">IrgendEinTyp* pointer = NULL;
</code></pre>
<p>Das führt auf den meisten Plattformen zu einem mehr oder weniger kontrolliertem Absturz falls man drauf zugreift und man darf einen Pointer der auf NUL zeigt auch mit delete löschen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/942051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/942051</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Wed, 14 Dec 2005 14:42:02 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 14:56:25 GMT]]></title><description><![CDATA[<p>Wo wir gerade bei Zeigern sind <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>Nehmen wir mal folgendes an:</p>
<pre><code class="language-cpp">int main()
{
    int intVar = 1234;
    int * intZeiger = &amp;intVar;

    // jetzt kommt der riskante Code
    for (::) { intZeiger++; }
}
</code></pre>
<p>Wenn ich jetzt den Pointer unendlich oft inkrementiere (wie oben), erreicht dieser irgendwann eine Art Überlauf und fängt wieder von vorne an? Oder kackt mir das Programm irgendwann ab?</p>
<p>Wichtig: Ich will nicht die Variable intVar erhöhen sondern die Adresse auf die der Zeiger zeigt.</p>
<p>Die eigentliche Frage ist: Gibt es bei Adressen auch so eine Art Wertebereich der irgendwie abhängig ist von der Größe des Arbeitspeichers? Und was passiert wenn dieser überschritten wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/942069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/942069</guid><dc:creator><![CDATA[Doktor Ruff]]></dc:creator><pubDate>Wed, 14 Dec 2005 14:56:25 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 15:01:38 GMT]]></title><description><![CDATA[<p>soweit ich weiß...<br />
macht der compiler aus pointer++ sowas wie pointerAddress + sizeof(pointertyp).<br />
der pointer läuft genauso über wie eine normale unsigned variable und fängt dann halt wieder bei 0 an. Solange du den Pointer nicht dereferezierst kannst du ihm jeden beliebigne Wert geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/942077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/942077</guid><dc:creator><![CDATA[templäd]]></dc:creator><pubDate>Wed, 14 Dec 2005 15:01:38 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 15:07:15 GMT]]></title><description><![CDATA[<p>Also in dem Code passiert erstmal garnichts ausser dass die CPU auf 100% laufen dürfte und der intZeiger sich von 0 bis ca. 4 Mio (bei 32 bit) im Kreis dreht (edit: in 4er Schritten) ^^</p>
<p>Wenn Du allerdings irgendwann mal intZeiger dereferenzierst - nunja das weisst Du ja jetzt <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/942078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/942078</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Wed, 14 Dec 2005 15:07:15 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 15:03:08 GMT]]></title><description><![CDATA[<p>Das kannst du ruhig machen. Solange du den pointer nicht dereferenzierst kannst du ihm zuweisen wasimmer du willst.<br />
Und natürlich gibts einen überlauf das hat aber nichts mit der grösse des Arbeitsspeichers zu tun. Der Pointer ist ( zumindest auf ia32 ) ein ganz normaler integraler Wert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/942079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/942079</guid><dc:creator><![CDATA[ZuK]]></dc:creator><pubDate>Wed, 14 Dec 2005 15:03:08 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor-Aufruf on Wed, 14 Dec 2005 15:06:39 GMT]]></title><description><![CDATA[<p>Ah gut. Wenn ich mir den Inhalt des Zeigers auf der Konsole mit 'cout' Anzeigen lasse kommen auf jedenfall jede Menge Zahlen zum Vorschein. Ich glaube weitere Fragen gehen zu sehr in die Speicherverwaltung bei C++ <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>
]]></description><link>https://www.c-plusplus.net/forum/post/942083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/942083</guid><dc:creator><![CDATA[Doktor Ruff]]></dc:creator><pubDate>Wed, 14 Dec 2005 15:06:39 GMT</pubDate></item></channel></rss>