2014-10-01 15 views
5

Ich frage mich, ob ich ein A* Mitglied in meiner Klasse haben, sollte es nicht automatisch auf nullptr setzen wir, wenn ich einen Konstruktor meiner Klasse in dieser Form haben:C++ - Standardkonstruktor initialisiert Zeiger auf nullptr nicht?

class MyCLass 
{ 
    A* m_pointer; 

public: 
    MyCLass() 
    { 
    } 
}; 

Spielt es eine Rolle, ob ich MyCLass* o = new MyCLass; tun oder Ich mache MyCLass* o = new MyCLass(); in C++ 11?

+3

Können Sie bitte Ihre Frage klären? – juanchopanza

+2

Sie brauchen keinen expliziten Zeiger an erster Stelle, verwenden Sie einfach 'std :: unique_ptr'. – 0x499602D2

+5

@ 0x499602D2 Was lässt Sie denken, dass diese Klasse der ausschließliche Besitzer des auf das Objekt gerichteten Objekts sein sollte? –

Antwort

14

Zeiger sind "POD types" ... a.k.a. "Einfache alte Daten". Die Regeln dafür, wann und wo sie sind default-initialisiert werden hier zusammengefasst:

Default initialization of POD types in C++

So nicht. Es spielt keine Rolle, was Ihr Konstruktor für eine Klasse ist, wenn es ein roher Zeiger als Mitglied der Klasse ist. Sie instanziieren die Klasse nicht tatsächlich. Mitglieder wie Foo * oder std::vector<Foo> * oder alles, das auf * endet, wird nicht auf nullptr initialisiert.

Die Smart-Pointer-Klassen sind kein POD. Wenn Sie also eine unique_ptr<Foo> oder eine shared_ptr<Foo> verwenden, die Instanzen von Klassen erstellt, die einen Konstruktor haben, der sie effektiv null macht, wenn Sie sie nicht initialisieren.

Ist es wichtig, wenn ich MyCLass * o = neue MyCLass; oder ich mache MyCLass * o = new MyCLass(); in C++ 11?

Eine Frage pro Frage, bitte.

Do the parentheses after the type name make a difference with new?

+0

Aber wenn ich überhaupt keinen Konstruktor definiere, wird es vermutlich von compiler generierten Standard-CTOR auf 'nullptr' initialisiert, oder? – Narek

+0

@Narek In diesem Fall müssten Sie 'MyClass m {};' oder 'MyCLass * m = new MyClass();' verwenden, um sicherzustellen, dass Datenelemente wie Zeiger auf Null initialisiert werden, dh Sie müssen * value-initialize * Objekt. – juanchopanza

+0

@Narek Nein. Sie könnten leicht mit einer Suche wie "was alles genau tut ein Standardkonstruktor und wann wird es aufgerufen?" und finde die Likes von [diese Antwort] (http://stackoverflow.com/questions/2417065/does-thedefault-constructor-initialize-built-in-types) – HostileFork

1

Der Standardkonstruktor, wenn Compiler generierte oder Verzug geraten, werden alle Mitglieder default-initialisiert werden. Jeder benutzerdefinierte Konstruktor wird standardmäßig alle Elemente initialisieren, die keinen expliziten Initialisierer in der Initialisierungsliste haben.

Um default-initialize bedeutet "rufen Sie den Standardkonstruktor für Klassen, lassen Sie alles andere nicht initialisiert".

Verwandte Themen