<?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[Initialisierung einer Klasse, wenn kein Konstruktor definiert wurde]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Mit aktuellen Compilern (VC Express 2005, MinGW, ...) erzeugt folgender Quelltext</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstddef&gt;
using namespace std;

class A {
    public:
    unsigned short us;
      // A(){};
    void* operator new(size_t size);

    static unsigned char meinKlassenChar;
};

unsigned char A::meinKlassenChar = 0xFF;

void* A::operator new(size_t size) {

    unsigned char* p = ::new(unsigned char[size]);

	for (unsigned int i=0 ; i &lt; size ; ++i)
		p[i] = meinKlassenChar;
	--meinKlassenChar;

    return p;
}

int main() {

    A* myA1 = new A();
    A* myA2 = new A;
    A* myA3 = new A();
    A* myA4 = new A;

    cout &lt;&lt;  hex &lt;&lt; (*myA1).us &lt;&lt; endl;
    cout &lt;&lt;  (*myA2).us &lt;&lt; endl;
    cout &lt;&lt;  (*myA3).us &lt;&lt; endl;
    cout &lt;&lt;  (*myA4).us &lt;&lt; endl;

    return 0;
}
</code></pre>
<p>die Ausgabe</p>
<pre><code>0
fefe
0
fcfc
</code></pre>
<p>Mit &quot;älteren&quot; Compilern (VC6, Watcom, ...) jedoch, sieht die Ausgabe so aus:</p>
<pre><code>ffff
fefe
fdfd
fcfc
</code></pre>
<p>Was genau passiert da bei der Initialisierung der Variablen? Wieso sind die Member von myA1 und myA3 mit 0 initialisiert? Ein eventuell implizit erzeugter Standardkonstruktor, der die Membervariablen initialisiert, würde doch wohl auch durch die Programmzeile</p>
<pre><code>A* myA2 = new A;
</code></pre>
<p>aufgerufen?</p>
<p>Wie werden die Member also initialisiert, bzw. was sagt der ISO-Standard dazu?</p>
<p>Vielen Dank schon mal fürs Lesen <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/topic/197114/initialisierung-einer-klasse-wenn-kein-konstruktor-definiert-wurde</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 02:57:25 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197114.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Nov 2007 19:58:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Initialisierung einer Klasse, wenn kein Konstruktor definiert wurde on Tue, 06 Nov 2007 19:58:49 GMT]]></title><description><![CDATA[<p>Hallo zusammen!</p>
<p>Mit aktuellen Compilern (VC Express 2005, MinGW, ...) erzeugt folgender Quelltext</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cstddef&gt;
using namespace std;

class A {
    public:
    unsigned short us;
      // A(){};
    void* operator new(size_t size);

    static unsigned char meinKlassenChar;
};

unsigned char A::meinKlassenChar = 0xFF;

void* A::operator new(size_t size) {

    unsigned char* p = ::new(unsigned char[size]);

	for (unsigned int i=0 ; i &lt; size ; ++i)
		p[i] = meinKlassenChar;
	--meinKlassenChar;

    return p;
}

int main() {

    A* myA1 = new A();
    A* myA2 = new A;
    A* myA3 = new A();
    A* myA4 = new A;

    cout &lt;&lt;  hex &lt;&lt; (*myA1).us &lt;&lt; endl;
    cout &lt;&lt;  (*myA2).us &lt;&lt; endl;
    cout &lt;&lt;  (*myA3).us &lt;&lt; endl;
    cout &lt;&lt;  (*myA4).us &lt;&lt; endl;

    return 0;
}
</code></pre>
<p>die Ausgabe</p>
<pre><code>0
fefe
0
fcfc
</code></pre>
<p>Mit &quot;älteren&quot; Compilern (VC6, Watcom, ...) jedoch, sieht die Ausgabe so aus:</p>
<pre><code>ffff
fefe
fdfd
fcfc
</code></pre>
<p>Was genau passiert da bei der Initialisierung der Variablen? Wieso sind die Member von myA1 und myA3 mit 0 initialisiert? Ein eventuell implizit erzeugter Standardkonstruktor, der die Membervariablen initialisiert, würde doch wohl auch durch die Programmzeile</p>
<pre><code>A* myA2 = new A;
</code></pre>
<p>aufgerufen?</p>
<p>Wie werden die Member also initialisiert, bzw. was sagt der ISO-Standard dazu?</p>
<p>Vielen Dank schon mal fürs Lesen <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/1398880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398880</guid><dc:creator><![CDATA[vic1986]]></dc:creator><pubDate>Tue, 06 Nov 2007 19:58:49 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung einer Klasse, wenn kein Konstruktor definiert wurde on Tue, 06 Nov 2007 20:27:06 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">unsigned char* p = ::new(unsigned char[size]);
</code></pre>
<p>Lass die runden Klammern weg. Ich hab zwar keinen Compiler zur Hand, der das verweigert, es ist aber so nicht standardkonform (weil size kein konstanter Ausdruck ist).</p>
<p>A ist ein POD. automatische und dynamische PODs werden nicht implizit initialisiert.</p>
<pre><code class="language-cpp">new A()
</code></pre>
<p>initialisiert das Objekt mit dem implizit generierten Defaultkonstruktor, der alle Member defaultkonstruiert, bzw. Skalare mit 0 intialsiert.</p>
<p>bei</p>
<pre><code class="language-cpp">new A
</code></pre>
<p>unterbleibt die Initialisierung.</p>
<p>Ältere Compiler sind ggf. weniger standardkonform.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1398886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398886</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 06 Nov 2007 20:27:06 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung einer Klasse, wenn kein Konstruktor definiert wurde on Tue, 06 Nov 2007 20:30:06 GMT]]></title><description><![CDATA[<p>Ich bin nicht sicher, aber ich würde sagen, da A ein POD ist (nur triviale Member, nicht virtuell, keine Kopieroperationen), greifen hier die Regeln zur POD-Initialisierung. Und die besagen (und da bin ich sicher), dass wenn ein POD default-initialisiert wird alle Mitglieder rekursiv default-initialisiert werden. Und das bedeutet, dass sie den Wert einer in den Zieltyp konvertierten 0 erhalten. Der Aufruf von new A ohne die Klammern enthält keine Default-Initialisierung, der mit Klammern schon.</p>
<p>EDIT:<br />
Zu spät, aber camper war wie üblich eh wieder ausführlicher <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/1398887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1398887</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 06 Nov 2007 20:30:06 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung einer Klasse, wenn kein Konstruktor definiert wurde on Wed, 07 Nov 2007 13:27:21 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure Antworten!</p>
<p>Eine kurze Nachfrage hätte ich aber noch. <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>Nachdem ich gestern nun auch den ISO-Standard kurz überflogen habe, war ich der Meinung, dass bei einem POD implizit überhaupt kein Defaultkonstruktor erzeugt wird. D.h. mit dem Ausdruck</p>
<pre><code class="language-cpp">new T;
</code></pre>
<p>erfolgt im Falle eines PODs keine Initialisierung. Und mit</p>
<pre><code class="language-cpp">new T();
</code></pre>
<p>würde eine &quot;Value-Initialisierung&quot; erfolgen, was dann auch das Nullsetzen bewirkt.</p>
<p>Leider verträgt sich das nicht ganz mit campers Antwort. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Ein implizit erzeugter Standardkonstruktor würde doch von beiden Ausdrücken aufgerufen werden?</p>
<p>Vorab meine Bitte um Nachsicht für die Haarspalterei. <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/</p>
<p>Bedeutet ein explizit bzw. implizit erzeugter Konstruktor nicht auch, dass das Objekt kein POD mehr ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399152</guid><dc:creator><![CDATA[vic1986]]></dc:creator><pubDate>Wed, 07 Nov 2007 13:27:21 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung einer Klasse, wenn kein Konstruktor definiert wurde on Wed, 07 Nov 2007 14:00:25 GMT]]></title><description><![CDATA[<p>Sprachlich ganz streng genommen hast du recht, für POD-Klassen besteht allerdings kein beobachtbarer Unterschied zwischen Value-Initialisierung und Aufruf des Defaultkonstruktors.</p>
<p>8.5/9<br />
Wenn für ein nicht-statisches Objekt kein Initialisierer angegeben wird, so wird nur für nicht-POD-Klassen (bzw. Arrays aus solchen Klassen) der Defaultkonstruktor aufgerufen, andernfalls unterbleibt jede Initialisierung, wie bei new A.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399182</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 07 Nov 2007 14:00:25 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung einer Klasse, wenn kein Konstruktor definiert wurde on Wed, 07 Nov 2007 16:08:06 GMT]]></title><description><![CDATA[<p>OK.</p>
<p>Nochmal Danke!</p>
<p>Gibt es den ISO-Standard irgendwo auf Deutsch, oder in einem html- oder chm-Format? Komme mit der PDF-Datei irgendwie nicht zurecht.</p>
<p>Oder hast du den Abschnitt schnell übersetzt? <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/1399283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399283</guid><dc:creator><![CDATA[vic1986]]></dc:creator><pubDate>Wed, 07 Nov 2007 16:08:06 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung einer Klasse, wenn kein Konstruktor definiert wurde on Thu, 08 Nov 2007 08:47:09 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich nutze immer <a href="http://www.amazon.de/C-Standard-Incorporating-Technical-Corrigendum/dp/0470846747/" rel="nofollow">den hier</a> und komme damit ganz gut klar.</p>
<p>AAABER: Die Schwierigkeit dabei liegt IMHO nicht in der Darstellungsform (Englisch, elektronisch/Papier, pdf/html, ....), sondern im Thema selbst.<br />
Der Standard ist eben KEIN Lernbuch/Tutorial, das einem die Sprache näherbringen will, sondern eine (möglichst) exakte Darstellung aller Spracheigenschaften.<br />
Prima zum Nachschlagen aber eher sperrig zum &quot;Neulernen&quot;.</p>
<p>Gruß,</p>
<p>Simon2.</p>
<p>P.S.: Ich möchte meiner Vermutung Ausdruck verleihen, dass Du mit &quot;dem pdf&quot; nicht den legalen (und kostenpflichtigen) Download von der ISO-Homepage meinst.<br />
Denn das solltest Du wissen ... <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/1399579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399579</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 08 Nov 2007 08:47:09 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung einer Klasse, wenn kein Konstruktor definiert wurde on Thu, 08 Nov 2007 10:55:10 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ja, die Schierigkeit liegt in den vielen Definitionen. Vor allem, wenn man nicht so häufig damit zu tun hat. Ohne Querverlinkung wird das Lesen dann zur Tortur. Natürlich könnte man das auch im PDF-Format realisieren.</p>
<p>Danke für deinen Hinweis. Ich habe nicht so häufig mit dem ISO-Standard zu tun und wusste daher auch nicht wie der vertrieben wird. Peinlich. <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>Die PDF-Datei habe ich gestern über das englische Wikipedia zum Thema PODs gefunden. Sie ist in dem Artikel direkt verlinkt.</p>
<p>OK, ich ziehe meine Frage hiermit zurück. :-)))</p>
<p>Danke dir!</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399644</guid><dc:creator><![CDATA[vic1986]]></dc:creator><pubDate>Thu, 08 Nov 2007 10:55:10 GMT</pubDate></item><item><title><![CDATA[Reply to Initialisierung einer Klasse, wenn kein Konstruktor definiert wurde on Thu, 08 Nov 2007 12:05:59 GMT]]></title><description><![CDATA[<p>vic1986 schrieb:</p>
<blockquote>
<p>...<br />
Ja, die Schierigkeit liegt in den vielen Definitionen. Vor allem, wenn man nicht so häufig damit zu tun hat. Ohne Querverlinkung wird das Lesen dann zur Tortur....</p>
</blockquote>
<p>Finde ich allerdings auch ! <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="😉"
    /><br />
Der Standard ist eher &quot;Schwarzbrot&quot;: geht erst schwerer runter, macht aber auf Dauer fitter.<br />
Einiges verstehe ich inzwischen &quot;aus dem Standard&quot; heraus, Anderes nicht ... dafür suche ich dann wonders. Zur Not warte ich, bis camper hier etwas dazu sagt. <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>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1399698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1399698</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 08 Nov 2007 12:05:59 GMT</pubDate></item></channel></rss>