Frage

Ich habe ein Buch S. Lippman "Innerhalb des C ++ - Objektmodells" gelesen, gibt es ein solcher Code

class Foo { public: int val; Foo *pnext; };
void foo_bar()
{
// Oops: program needs bar's members zeroed out
Foo bar;
Foo* baz = new Foo(); // this line i added myself
if ( bar.val || bar.pnext )
// ... do something
// ...
}

Und es heißt, dass "ein Standardkonstruktor für dieses Codefragment nicht synthetisiert wird.

Globale Objekte haben garantiert, dass der zugehörige Speicher beim Programm Start-up "Null" wird. Lokale Objekte, die auf dem auf dem Freigeschäft zugewiesenen Programmstapel und Heap-Objekten zugewiesen wurden, haben den zugeordneten Speicher nicht übernommen. Vielmehr behält der Speicher das willkürliche Bitmuster seiner vorherigen Verwendung bei. "

In diesem Code wurde das BAZ -Objekt auf dem Haufen erstellt, und nach dem, was oben erwähnt wurde, ist dieses Objekt nicht global und wird nicht als Standardkonstruktor bezeichnet. Ich verstehe korrekt ?

War es hilfreich?

Lösung

Die Klammern in new Foo() angeben Wertinitialisierung; Dies bedeutet im Grunde, dass jedes Mitglied null initialisiert ist. Wenn Sie stattdessen gesagt haben new Foo, und dann würden die Mitglieder nicht uneinheitlich bleiben, da sie für Ihre automatische Variable sind.

Um die automatische Variable zu schätzen, können Sie leider nicht schreiben Foo bar(), Da das eine Funktion erklärt. Du brauchst

Foo bar{};        // C++11
Foo bar = Foo();  // Historical C++

Andere Tipps

Wenn Sie das tun:

Foo* baz = new Foo();

Sie zuweisen dynamisch a Foo Instanz und Wertinitialisierung es. Für Pods bedeutet dies, dass die Mitglieder null initialisiert werden. Wenn Sie dies gesagt hätten (unter der Annahme eines nicht-globalen Kontextes):

Foo* baz = new Foo;

dann ist die Foo Die Instanz würde standardmäßig initialisiert, was bedeuten würde, dass keine Initialisierung seiner Mitglieder durchgeführt wird, da sie Pods sind.

Dies gilt auch für automatische Speicherinstanzen:

Foo f0; // default initializaiton: members not zeroed out.
Foo f1 = Foo(); // value initialization: members zeroed out.
Foo f2{}; // C++11 value initialization: members zeroed out.
Foo f3(); // Ooops! Function declaration. Something completely different.

Wenn eine Klasse keinen Standardkonstruktor (und keinen anderen Konstruktor) hat, erstellt der Compiler einen für Sie. Es muss oder Sie nicht in der Lage sein würden, Instanzen der Klasse zu erstellen. Der generierte Standardkonstruktor wird jedoch nichts bewirken.

Was Hinzufügen des leeren Satzes von Klammern in new Foo() Dies gilt, um das zugewiesene Objekt initialisieren, was bedeutet nullptr Für Zeiger.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top