Je suis très confus au sujet de l'initialisation de la valeur et par défaut et zéro. et surtout lorsqu'ils se lancent dans les différents standards C ++ 03 et C ++ 11 (et C ++ 14 ).
Je cite et j'essaie d'étendre une très bonne réponse Value- / Default- / Zero- Init C ++ 98 et C ++ 03 ici pour la rendre plus générale car cela aiderait beaucoup d'utilisateurs si quelqu'un pouvait aider à remplir le besoin de lacunes pour avoir une bonne vue d'ensemble de ce qui se passe quand?
Un aperçu complet par des exemples en un mot:
Parfois, la mémoire retournée par l'opérateur new sera initialisée, et parfois cela ne le sera pas selon que le type que vous créez est un POD (données anciennes simples) , ou s'il s'agit d'une classe qui contient des membres POD et utilise un constructeur par défaut généré par le compilateur.
- Dans C ++ 1998, il existe 2 types d'initialisation: zéro et initialisation par défaut
- En C ++ 2003, un troisième type d'initialisation, l'initialisation de la valeur a été ajoutée.
- Dans C ++ 2011 / C ++ 2014, seule l' initialisation de liste a été ajoutée et les règles d' initialisation de valeur / par défaut / zéro ont un peu changé.
Présumer:
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 */
Dans un compilateur C ++ 98, ce qui suit doit se produire :
new A- valeur indéterminée (Aest POD)new A()- initialisation à zéronew B- construction par défaut (B::mnon initialisée,Bnon-POD)new B()- construction par défaut (B::mnon initialisée)new C- construction par défaut (C::minitialisée à zéro,Cnon POD)new C()- construction par défaut (C::mest initialisé à zéro)new D- construction par défaut (D::mnon initialisée,Dnon-POD)new D()- construction par défaut? (D::mn'est pas initialisé)
Dans un compilateur conforme C ++ 03, les choses devraient fonctionner comme ceci:
new A- valeur indéterminée (Aest POD)new A()- value-initializeA, qui est une initialisation à zéro puisqu'il s'agit d'un POD.new B- initialise par défaut (laisseB::mnon initialisé,Bn'est pas POD)new B()- value-initializesBqui initialise à zéro tous les champs puisque son ctor par défaut est généré par le compilateur et non défini par l'utilisateur.new C- default-initializesC, qui appelle le ctor par défaut. (C::mest initialisé à zéro,Cest non POD)new C()- value-initializesC, qui appelle le ctor par défaut. (C::mest initialisé à zéro)new D- construction par défaut (D::mnon initialisée,Dnon POD)new D()- valeur-initialise D? , qui appelle le ctor par défaut (D::mn'est pas initialisé)
Valeurs italiques et? sont des incertitudes, veuillez aider à corriger cela :-)
Dans un compilateur conforme C ++ 11, les choses devraient fonctionner comme ceci:
??? (aidez-moi si je commence ici, ça ira de toute façon mal)
Dans un compilateur conforme C ++ 14, les choses devraient fonctionner comme suit: ??? (Aidez-moi si je commence ici, ça ira de toute façon mal) (Brouillon basé sur la réponse)
new A- initialise par défautA, compilateur gen. ctor, (laisseA::mnon initialisé) (Aest POD)new A()- value-initializesA, qui est une initialisation à zéro depuis 2. point dans [dcl.init] / 8new B- initialise par défautB, compilateur gen. ctor, (laisseB::mnon initialisé) (Best non-POD)new B()- value-initializesBqui initialise à zéro tous les champs puisque son ctor par défaut est généré par le compilateur et non défini par l'utilisateur.new C- default-initializesC, qui appelle le ctor par défaut. (C::mest initialisé à zéro,Cest non POD)new C()- value-initializesC, qui appelle le ctor par défaut. (C::mest initialisé à zéro)new D- initialise par défautD(D::mn'est pas initialisé,Dn'est pas POD)new D()- value-initializesD, qui appelle le ctor par défaut (D::mn'est pas initialisé)new E- default-initializesE, qui appelle le comp. gen. ctor. (E::mn'est pas initialisé, E est non-POD)new E()- value-initializesE, qui s'initialise à zéroEdepuis 2 points dans [dcl.init] / 8 )new F- default-initializesF, qui appelle le comp. gen. ctor. (F::mn'est pas initialisé,Fn'est pas POD)new F()- value-initializesF, qui s'initialise par défautFdepuis 1. point dans [dcl.init] / 8 (laFfonction ctor est fournie par l'utilisateur si elle est déclarée par l'utilisateur et non explicitement par défaut ou supprimée lors de sa première déclaration. Lien )