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 (A
est POD)new A()
- initialisation à zéronew B
- construction par défaut (B::m
non initialisée,B
non-POD)new B()
- construction par défaut (B::m
non initialisée)new C
- construction par défaut (C::m
initialisée à zéro,C
non POD)new C()
- construction par défaut (C::m
est initialisé à zéro)new D
- construction par défaut (D::m
non initialisée,D
non-POD)new D()
- construction par défaut? (D::m
n'est pas initialisé)
Dans un compilateur conforme C ++ 03, les choses devraient fonctionner comme ceci:
new A
- valeur indéterminée (A
est 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::m
non initialisé,B
n'est pas POD)new B()
- value-initializesB
qui 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::m
est initialisé à zéro,C
est non POD)new C()
- value-initializesC
, qui appelle le ctor par défaut. (C::m
est initialisé à zéro)new D
- construction par défaut (D::m
non initialisée,D
non POD)new D()
- valeur-initialise D? , qui appelle le ctor par défaut (D::m
n'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::m
non initialisé) (A
est 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::m
non initialisé) (B
est non-POD)new B()
- value-initializesB
qui 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::m
est initialisé à zéro,C
est non POD)new C()
- value-initializesC
, qui appelle le ctor par défaut. (C::m
est initialisé à zéro)new D
- initialise par défautD
(D::m
n'est pas initialisé,D
n'est pas POD)new D()
- value-initializesD
, qui appelle le ctor par défaut (D::m
n'est pas initialisé)new E
- default-initializesE
, qui appelle le comp. gen. ctor. (E::m
n'est pas initialisé, E est non-POD)new E()
- value-initializesE
, qui s'initialise à zéroE
depuis 2 points dans [dcl.init] / 8 )new F
- default-initializesF
, qui appelle le comp. gen. ctor. (F::m
n'est pas initialisé,F
n'est pas POD)new F()
- value-initializesF
, qui s'initialise par défautF
depuis 1. point dans [dcl.init] / 8 (laF
fonction 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 )