Sono molto confuso sull'inizializzazione di valori e valori predefiniti e zero. e soprattutto quando entrano in gioco per i diversi standard C ++ 03 e C ++ 11 (e C ++ 14 ).
Sto citando e cercando di estendere una risposta davvero buona Value- / Default- / Zero- Init C ++ 98 e C ++ 03 qui per renderlo più generale in quanto aiuterebbe molti utenti se qualcuno potesse aiutare a compilare il aveva bisogno di lacune per avere una buona panoramica su cosa succede e quando?
La visione completa degli esempi in poche parole:
A volte la memoria restituita dal nuovo operatore verrà inizializzata, ea volte non dipenderà dal fatto che il tipo che stai facendo di nuovo sia un POD (semplici dati vecchi) , o se è una classe che contiene membri POD e sta usando un costruttore predefinito generato dal compilatore.
- In C ++ 1998 ci sono 2 tipi di inizializzazione: zero e inizializzazione predefinita
- In C ++ 2003 è stato aggiunto un terzo tipo di inizializzazione, l'inizializzazione del valore .
- In C ++ 2011 / C ++ 2014 è stata aggiunta solo l' inizializzazione dell'elenco e le regole per l' inizializzazione valore / predefinito / zero sono state leggermente modificate.
Assumere:
struct A { int m; };
struct B { ~B(); int m; };
struct C { C() : m(){}; ~C(); int m; };
struct D { D(){}; int m; };
struct E { E() = default; int m;}; /** only possible in c++11/14 */
struct F {F(); int m;}; F::F() = default; /** only possible in c++11/14 */
In un compilatore C ++ 98, dovrebbe verificarsi quanto segue :
new A
- valore indeterminato (A
è POD)new A()
- zero-inizializzazionenew B
- costrutto predefinito (B::m
non è inizializzato,B
non è POD)new B()
- costrutto predefinito (B::m
non è inizializzato)new C
- costrutto predefinito (C::m
è inizializzato a zero,C
non è POD)new C()
- costrutto predefinito (C::m
è inizializzato a zero)new D
- costrutto predefinito (D::m
non è inizializzato,D
non è POD)new D()
- costrutto predefinito? (D::m
non è inizializzato)
In un compilatore conforme a C ++ 03, le cose dovrebbero funzionare così:
new A
- valore indeterminato (A
è POD)new A()
- value-initializeA
, che è zero-inizializzazione poiché è un POD.new B
- default-initializes (lasciaB::m
non inizializzato,B
non è POD)new B()
- value-initializesB
che azzera tutti i campi poiché il suo ctor predefinito è generato dal compilatore invece di quello definito dall'utente.new C
- default-initializesC
, che chiama il ctor predefinito. (C::m
è inizializzato a zero,C
non è POD)new C()
- value-initializesC
, che chiama il ctor predefinito. (C::m
è zero-inizializzato)new D
- costrutto predefinito (D::m
non è inizializzato,D
non è POD)new D()
- valore-inizializza D? , che chiama il ctor predefinito (D::m
non è inizializzato)
Valori italici e? sono incertezze, per favore aiutaci a correggere questo :-)
In un compilatore conforme a C ++ 11, le cose dovrebbero funzionare così:
??? (per favore aiutatemi se comincio da qui andrà comunque storto)
In un compilatore conforme a C ++ 14, le cose dovrebbero funzionare così: ??? (per favore aiutatemi se inizio da qui andrà comunque storto) (Bozza basata sulla risposta)
new A
- inizializzazione di defaultA
, compilatore gen. ctor, (leavsA::m
uninitialized) (A
is POD)new A()
- value-initializesA
, che è zero-inizializzazione dal 2. punto in [dcl.init] / 8new B
- inizializzazione di defaultB
, compilatore gen. ctor, (leavsB::m
uninitialized) (B
is non-POD)new B()
- value-initializesB
che azzera tutti i campi poiché il suo ctor predefinito è generato dal compilatore invece di quello definito dall'utente.new C
- default-initializesC
, che chiama il ctor predefinito. (C::m
è inizializzato a zero,C
non è POD)new C()
- value-initializesC
, che chiama il ctor predefinito. (C::m
è zero-inizializzato)new D
- default-initializesD
(D::m
non è inizializzato,D
non è POD)new D()
- value-initializesD
, che chiama il ctor predefinito (D::m
non è inizializzato)new E
- default-initializesE
, che chiama comp. gen. ctor. (E::m
non è inizializzato, E non è POD)new E()
- value-initializesE
, che inizializza a zeroE
dal 2 punto in [dcl.init] / 8 )new F
- default-initializesF
, che chiama comp. gen. ctor. (F::m
non è inizializzato,F
non è POD)new F()
- value-initializesF
, che viene inizializzato per impostazione predefinitaF
dal 1. punto in [dcl.init] / 8 (laF
funzione ctor è fornita dall'utente se è dichiarata dall'utente e non è esplicitamente predefinita o eliminata nella sua prima dichiarazione. Link )