2010-04-10 22 views
44

Quali sono i valori predefiniti per i membri di una struct e membri di una classe in C++ e in che modo differiscono queste regole (ad esempio tra classi/structs/primitives/etc)? Ci sono circostanze in cui le regole sui valori predefiniti sono diverse?Qual è il valore predefinito per i membri della classe C++

+2

Vedere anche: http://stackoverflow.com/questions/1613341/what-do-the-following-phrases-mean-in-c-zero-default-and-value-initializati, http: // stackoverflow. it/questions/2417065/c-does-the-default-constructor-initialize-built-in-types, http://stackoverflow.com/questions/1069621/are-members-of-ac-struct-initialized-to- 0-by-default – outis

risposta

41

Non ci sono differenze tra le strutture e le classi in questo senso in C++. Sono tutti chiamati solo tipi di classe .

I membri dei tipi di classe non hanno valori predefiniti in generale. Al fine di un membro della classe per ottenere un valore deterministico deve essere inizializzato, che può essere fatto da

  • default costruttore il membro stesso
  • Costruttore lista di inizializzazione della classe contenitrice
  • Inizializzatore esplicitamente specificato per l'oggetto della classe di inclusione (che include inizializzazione del valore e inizializzazione con inizializzatore aggregato).

Inoltre, tutti gli oggetti con durata di memorizzazione statica vengono inizializzati a zero all'avvio del programma.

A parte i casi sopra riportati, i membri della classe, ancora una volta, non hanno valori predefiniti e inizialmente contengono valori di spazzatura imprevedibili.

+0

Se la memoria statica è azzerata, l'inizializzazione dipende dal sistema operativo in esecuzione. – jpyllman

+12

@jpyllman: No. La memoria statica è sempre inizializzata a zero. È garantito (richiesto) dalla lingua, indipendentemente da qualsiasi sistema operativo. – AnT

+0

OK, ho provato a trovare tali informazioni ma non trovarle. Ho sempre pensato che non sia definito a meno che non si imposti un valore. – jpyllman

14

Sì, ce n'è uno. Se si inizializza un oggetto con il costruttore di default e utilizzare parentesi poi i membri POD saranno pari a zero inizializzato:

someClass * p = new someClass(); 
+0

Questa affermazione non è vera. Dipende molto da chi ha scritto il compilatore. Non c'è nulla nello standard che dice che un valore POD verrà inizializzato su qualsiasi cosa a meno che il programmatore non abbia assegnato un valore ad esso. Questo è il motivo per cui esistono strumenti di sviluppo come valgrind. – WhoCares

+0

@DamianDixon No, vedere di seguito: 'C++ 14 8.5 11' *" Un oggetto il cui inizializzatore è un insieme vuoto di parentesi, vale a dire(), deve essere inizializzato con il valore. "*. '8.5 8' *" Per inizializzare il valore di un oggetto di tipo T significa: ... se T è un tipo di classe (eventualmente qualificata per cv) senza un costruttore predefinito fornito dall'utente o eliminato, quindi l'oggetto è inizializzato a zero ... "*' 8.5 6' * "Per azzerare l'inizializzazione di un oggetto o riferimento di tipo T significa: ... - se T è un tipo di classe non sindacale (eventualmente qualificata per cv), ogni membro di dati non statici e ogni su basebase subobject è inizializzato a zero ... "* – HolyBlackCat

+0

@HolyBlackCat, devi comunque usare una parentesi vuota. Se non si aggiunge(), cioè fornire una sorta di inizializzazione, non si ottiene questo comportamento e si finisce con un POD non inizializzato. Quindi il programmatore deve fare qualcosa per inizializzare la variabile. – WhoCares

Problemi correlati