2017-02-05 3 views
12

Ich aktualisiere eine Klasse nach C++ 14 und versuche, die einfachste Möglichkeit zu finden, alle Instanzvariablen bei der Konstruktion auf Null zu initialisieren. Hier ist, was ich bisher:Initialisiert der default-Standardkonstruktor Variablen auf Null?

class MyClass { 
public: 
    int var; 
    float* ptr; 
    double array[3]; 
    MyStruct data; 
    unique_ptr<MyStruct> smart_ptr; 

    MyClass() = default; 
    ~MyClass() = default; 
} 

setzt den Konstruktor default das Äquivalent zu tun:

MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {} 

... oder muss ich jede Variable init? (. Ich habe versucht, sowohl in Visual Studio und ich Nullen oder so, aber ich bin nicht sicher, ob das Glück ist oder nicht)

Ich Instancing die Klasse ohne Klammern: MyClass obj;

+2

Mann, ich wollte dir eine selbstgefällige Antwort geben, aber jetzt bin ich mir nicht sicher. Siehe auch http://stackoverflow.com/questions/2417065/does-thedefault-constructor-initialize-built-in-types – Mikhail

+0

Hahah :) Ich weiß, richtig! Ich habe diesen Post tatsächlich gesehen, aber es war wirklich dieser Kommentar, der mich unsicher machte: http://stackoverflow.com/questions/2417065/does-thedefault-constructor-initialize-built-in-types#comment36188015_2418195. Also null-inits, wenn Sie überhaupt keinen Konstruktor haben, und 'MyClass instance()' mit eckigen Klammern aufrufen? : | –

+0

Logischerweise würde das Setzen eines Konstruktors auf "default" erwartet, dass die Mitglieder standardmäßig initialisiert werden. Default-Initialisierung ist nicht immer gleich Null Initialisierung. – Peter

Antwort

11

Ist den Konstruktor Einstellung das Äquivalent zu tun auf Standard:

MyClass() : var{}, ptr{}, array{}, data{}, smart_ptr{} {} 

Nein, es ist nicht.


Die Linie

MyClass() = default; 

ist verwandt mit, aber nicht genau äquivalent zu:

MyClass() {} 

In jedem Fall unter Verwendung von

MyClass obj; 

führt zu einer Default- initialisiertes Objekt, dessen Mitglieder defa sind ut initialisiert.

jedoch zwischen ihnen der Unterschied, wenn

mit
MyClass obj{}; 

ist, dass obj Null initialisiert mit dem notleidenden Standardkonstruktors sein wird, während es noch mit dem Benutzer zur Verfügung gestellt Standardkonstruktor initialisiert Verzug.

+0

typo: int {} sollte var {} sein –

+0

Fest, danke! Ich weiß deine Antwort auch zu schätzen. Habe ich recht, wenn ich bedenke, dass 'MyClass() {}' ein benutzerdefinierter Konstruktor ist, während 'MyClass = default;' ein Standardkonstruktor ist, so dass er unter bestimmten Umständen auf Null gesetzt wird? http: // Stapelüberlauf.com/questions/26699720/value-initialization-default-initialization-or-zero-initialization –

+0

@ChrisNolet "default constructor" bedeutet einen Konstruktor, der ohne Argumente aufgerufen werden kann –

3

Um alle Ihre Variablen zu machen auf dem Bau-Null initialisiert, auch wenn der Schöpfer es nicht angefordert haben, eine Möglichkeit ist:

struct MyClassMembers 
{ 
    int var; 
    float* ptr; 
    double array[3]; 
    MyStruct data; 
    unique_ptr<MyStruct> smart_ptr; 
}; 

struct MyClass : MyClassMembers 
{ 
    MyClass(): MyClassMembers{} {} 
}; 

Dann MyClass m;MyClassMembers{} verwenden die Mitglieder zu initialisieren.

+0

es sei denn, eines der Mitglieder hat einen Standard-Konstruktor, der nicht Standard ist, wie in R Sahus Antwort – Danra

+0

@Danra beschrieben. Ich nehme an, dass OP mit einem Mitglied in Ordnung ist, das seinen eigenen Konstruktor wie definiert verwendet –

Verwandte Themen