2017-02-05 16 views
12

Aktualizuję klasę do C++ 14 i próbuję znaleźć najprostszy sposób zainicjowania wszystkich zmiennych instancji na zero w konstrukcji. Oto co mam do tej pory:Czy domyślny konstruktor domyślny inicjuje zmienne do zera?

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

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

Czy ustawienia konstruktora do default równowartość robi:

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

... czy trzeba init każdej zmiennej? (. Próbowałem zarówno w Visual Studio i mam zerami tak czy inaczej, ale nie jestem pewien, czy to szczęście czy nie)

mam Instancing klasę bez nawiasów: MyClass obj;

+2

Człowieku, zamierzałem dać ci zadowoloną odpowiedź, ale teraz nie jestem pewien. Zobacz także http://stackoverflow.com/questions/2417065/does-the-default-constructor-initialize-built-in-types – Mikhail

+0

Hahah :) Wiem, prawda! Właściwie to widziałem, ale to był naprawdę ten komentarz, który sprawił, że poczułem niepewność: http://stackoverflow.com/questions/2417065/does-default-constructor-initialize-built-in-types#comment36188015_2418195. Więc zeruje się, jeśli w ogóle nie masz konstruktora i wywołujesz 'instancję MyClass()' za pomocą nawiasów? : | –

+0

Logicznie, domyślnym ustawieniem konstruktora na "default" będzie inicjowanie członków. Inicjalizacja domyślna nie zawsze jest równoważna inicjalizacji zerowej. – Peter

Odpowiedz

11

Czy ustawienie domyślne konstruktora równowartość robi:

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

nie, to nie jest.


Linia

MyClass() = default; 

jest bardziej zbliżona do, ale nie dokładnie równoważne:

MyClass() {} 

W obu przypadkach za pomocą

MyClass obj; 

wyników w Default zainicjowany obiekt, którego członkowie są defa zainicjowano ult.

Jednak różnica między nimi przy użyciu

MyClass obj{}; 

że obj będzie zero zainicjowany z niewykonaniem domyślnego konstruktora podczas gdy nadal będą domyślnie zainicjowany z domyślnego konstruktora warunkiem użytkownika.

+0

literówka: int {} powinno być var ​​{} –

+0

Naprawiono, dzięki! Doceniam również twoją odpowiedź. Czy mam rację, myśląc, że 'MyClass() {}' jest konstruktorem dostarczonym przez użytkownika, podczas gdy 'MyClass = default;' jest konstruktorem domyślnym, więc w pewnych okolicznościach byłby on inicjalizowany od zera? http: // stackoverflow.com/questions/26699720/value-initialization-default-initialization-or-zero-initialization –

+0

@ChrisNolet "default constructor" oznacza konstruktora, który może być wywołany bez argumentów –

3

Aby dokonać wszystkich zmiennych zero-zainicjowany na budowie, nawet jeśli twórca nie poprosić go, jednym ze sposobów jest:

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

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

Następnie MyClass m; użyje MyClassMembers{} zainicjować członków.

+0

, chyba że jeden z członków ma domyślnego konstruktora, którego nie ma w domyślnej konfiguracji, jak opisano w odpowiedzi R Sahu – Danra

+0

@Danra Zakładam, że OP jest w porządku z członkiem używającym własnego konstruktora, jak zdefiniowano –