2014-10-01 10 views
5

Zastanawiam się, czy mam członka w mojej klasie A*, nie powinien on automatycznie ustawiony na nullptr jeśli mam konstruktora mojej klasie w tej postaci:Domyślny konstruktor C++ nie inicjalizuje wskaźnika na nullptr?

class MyCLass 
{ 
    A* m_pointer; 

public: 
    MyCLass() 
    { 
    } 
}; 

to ma znaczenie, jeśli robię MyCLass* o = new MyCLass; lub Robię MyCLass* o = new MyCLass(); w C++ 11?

+3

Czy możesz wyjaśnić swoje pytanie? – juanchopanza

+2

Najpierw nie potrzebujesz wyraźnego wskaźnika, wystarczy użyć 'std :: unique_ptr'. – 0x499602D2

+5

@ 0x499602D2 Co sprawia, że ​​myślisz, że ta klasa powinna być wyłącznym właścicielem wskazanego obiektu? –

Odpowiedz

14

Wskaźniki to "POD rodzaje" ... a.k.a. "Zwykłe stare dane". Zasady, kiedy i gdzie są domyślne zainicjowany są zestawione tutaj:

Default initialization of POD types in C++

tak nie ma. Nie ma znaczenia, jaki jest twój konstruktor dla klasy, jeśli jest to surowy wskaźnik jako członek klasy. W rzeczywistości nie tworzysz instancji klasy. Więc członkowie tacy jak Foo * lub std::vector<Foo> * lub cokolwiek kończącego się na * nie zostaną zainicjowani na nullptr.

Klasy inteligentnych wskaźników to nie POD. Więc jeśli używasz unique_ptr<Foo> lub shared_ptr<Foo>, który tworzy wystąpienia klas, które mają konstruktor, który je efektywnie null, jeśli nie zainicjujesz ich.

Czy to ma znaczenie, czy robię MyCLass * o = nowy MyCLass; lub robię MyCLass * o = new MyCLass(); w C++ 11?

Jedno pytanie na pytanie.

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

+0

Ale jeśli nie zdefiniuję konstruktora w ogóle, myślę, że zostanie on zainicjowany na 'nullptr' przez wygenerowany przez kompilator domyślny CTOR, prawda? – Narek

+0

@Narek W takim przypadku będziesz potrzebować 'MyClass m {};' lub 'MyCLass * m = new MyClass();' aby upewnić się, że elementy danych, takie jak wskaźniki, są zainicjalizowane od zera, tzn. Musisz * wartość-zainicjować * obiekt. – juanchopanza

+0

@Narek Nie. Można łatwo odczytać z wyszukiwania, jak "co dokładnie robi domyślny konstruktor i kiedy jest wywoływany?" i znaleźć podobne [tę odpowiedź] (http://stackoverflow.com/questions/2417065/does-the-default-constructor-initialize-built-in-types) – HostileFork

1

Domyślny konstruktor, jeśli kompilator generowane lub domyślnie, będzie domyślnie zainicjować wszystkich członków. Każdy konstruktor zdefiniowany przez użytkownika będzie podobnie ustawiony domyślnie - zainicjować wszystkich członków, którzy nie mają jawnego inicjalizatora na liście inicjalizatora.

Inicjalizacja domyślna oznacza "wywołaj domyślny konstruktor dla klas, pozostaw wszystko inne niezainicjowane".

Powiązane problemy