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::mnon è inizializzato,Bnon è POD)new B()- costrutto predefinito (B::mnon è inizializzato)new C- costrutto predefinito (C::mè inizializzato a zero,Cnon è POD)new C()- costrutto predefinito (C::mè inizializzato a zero)new D- costrutto predefinito (D::mnon è inizializzato,Dnon è POD)new D()- costrutto predefinito? (D::mnon è 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::mnon inizializzato,Bnon è POD)new B()- value-initializesBche 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,Cnon è POD)new C()- value-initializesC, che chiama il ctor predefinito. (C::mè zero-inizializzato)new D- costrutto predefinito (D::mnon è inizializzato,Dnon è POD)new D()- valore-inizializza D? , che chiama il ctor predefinito (D::mnon è 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::muninitialized) (Ais POD)new A()- value-initializesA, che è zero-inizializzazione dal 2. punto in [dcl.init] / 8new B- inizializzazione di defaultB, compilatore gen. ctor, (leavsB::muninitialized) (Bis non-POD)new B()- value-initializesBche 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,Cnon è POD)new C()- value-initializesC, che chiama il ctor predefinito. (C::mè zero-inizializzato)new D- default-initializesD(D::mnon è inizializzato,Dnon è POD)new D()- value-initializesD, che chiama il ctor predefinito (D::mnon è inizializzato)new E- default-initializesE, che chiama comp. gen. ctor. (E::mnon è inizializzato, E non è POD)new E()- value-initializesE, che inizializza a zeroEdal 2 punto in [dcl.init] / 8 )new F- default-initializesF, che chiama comp. gen. ctor. (F::mnon è inizializzato,Fnon è POD)new F()- value-initializesF, che viene inizializzato per impostazione predefinitaFdal 1. punto in [dcl.init] / 8 (laFfunzione ctor è fornita dall'utente se è dichiarata dall'utente e non è esplicitamente predefinita o eliminata nella sua prima dichiarazione. Link )