2014-10-01 8 views
5

mi chiedo se ho un membro A* nella mia classe, non dovrebbe ci siamo messi al nullptr automaticamente se ho un costruttore della mia classe in questa forma:Il costruttore di default C++ non inizializza il puntatore a nullptr?

class MyCLass 
{ 
    A* m_pointer; 

public: 
    MyCLass() 
    { 
    } 
}; 

cosa importa se lo faccio MyCLass* o = new MyCLass; o Faccio MyCLass* o = new MyCLass(); in C++ 11?

+3

Potete chiarire la domanda? – juanchopanza

+2

In primo luogo non è necessario un puntatore esplicito, basta usare 'std :: unique_ptr'. – 0x499602D2

+5

@ 0x499602D2 Cosa ti fa pensare che questa classe debba essere il proprietario esclusivo dell'oggetto puntato? –

risposta

14

I puntatori sono "tipi POD" ... a.k.a. "Plain Old Data". Le regole per quando e dove sono default-inizializzati sono riassunte qui:

Default initialization of POD types in C++

Quindi no. Non importa quale sia il tuo costruttore per una classe, se è un puntatore raw come membro della classe. In realtà non stai creando un'istanza per la classe. Quindi membri come Foo * o std::vector<Foo> * o qualsiasi cosa che termina con * non saranno inizializzati su nullptr.

Le classi di puntatore intelligente non sono POD. Pertanto, se si utilizza un unique_ptr<Foo> o un shared_ptr<Foo> che crea istanze di classi, questo ha un costruttore che li rende effettivamente nulli se non li si inizializza.

Ha importanza se eseguo MyCLass * o = new MyCLass; oppure I MyCLass * o = new MyCLass(); in C++ 11?

Una domanda per domanda, per favore.

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

+0

Ma se non definisco affatto un costruttore, suppongo che sarà inizializzato a 'nullptr' dal CTOR predefinito generato dal compilatore, giusto? – Narek

+0

@Narek In tal caso è necessario 'MyClass m {};' o 'MyCLass * m = new MyClass();' per garantire che i membri dei dati come i puntatori siano inizializzati a zero, ovvero che sia necessario * value-initialize * the oggetto. – juanchopanza

+0

@Narek Nope. Si potrebbe facilmente leggere con una ricerca come "cosa fa esattamente un costruttore predefinito e quando viene richiamato?" e trova il mi piace di [questa risposta] (http://stackoverflow.com/questions/2417065/does-the-default-constructor-initialize-built-in-types) – HostileFork

1

Il costruttore predefinito, se generato dal compilatore o predefinita, imposterà-inizializzare tutti i membri. Analogamente, qualsiasi costruttore definito dall'utente inizializzerà automaticamente tutti i membri che non hanno un inizializzatore esplicito nell'elenco di inizializzazione.

Per inizializzare di default significa "chiama il costruttore predefinito per le classi, lascia tutto il resto non inizializzato".

Problemi correlati