Une variable déclarée peut être Zéro initialisé , Valeur initialisée ou Initialisé par défaut .
Dans votre exemple :
Info *p = new Info(); <------- Value Initialization
Info *p = new Info; <------- Default Initialization
La norme C++03 8.5/5 les définit avec justesse :
A zéro-initialisation un objet de type T signifie :
- si T est un type scalaire (3.9), l'objet prend la valeur de 0 (zéro) convertie en T ;
- si T est un type de classe non unitaire, chaque membre de données non statique et chaque sous-objet de classe de base
est initialisé à zéro ;
- si T est un type d'union, le premier membre de données nommé de l'objet est initialisé à zéro ;
- si T est un type tableau, chaque élément est initialisé à zéro ;
- si T est un type de référence, aucune initialisation n'est effectuée.
A initialisation par défaut un objet de type T signifie :
- si T est un type de classe non-POD (clause 9), le constructeur par défaut de T est appelé (et l'élément initialisation est mal formée si T n'a pas de constructeur par défaut accessible) ;
- si T est un type tableau, chaque élément est initialisé par défaut ;
- sinon, l'objet est réinitialisé à zéro.
A valeur-initialisation un objet de type T signifie :
- si T est un type de classe (clause 9) avec un constructeur déclaré par l'utilisateur (12.1), alors le constructeur par défaut de T est appelé (et l'initialisateur de T est appelé). de T est appelé (et l'initialisation est mal formée si T n'a pas de constructeur par défaut accessible). accessible) ;
- si T est un type de classe non syndiqué sans constructeur déclaré par l'utilisateur, alors tout type de classe non statique et composant de classe de base de T est initialisé par une valeur ;
- si T est un type tableau, alors chaque élément est initialisé par une valeur ;
- sinon, l'objet est initialisé zéro.