Initialisation par défaut des tableaux de membres C ++?

C’est une question simple, mais je n’arrive pas à trouver une réponse définitive.

Si nous avons la classe suivante:

class Test { ... char testArray[10]; ... }; 

Lorsque nous créons une instance de Test, quelle est la valeur par défaut de testArray [1]?

S’il s’agissait d’un tableau local, il serait non initialisé.
S’il s’agissait d’un tableau statique, il serait initialisé à 0.

Que fait-il lorsque le tableau est un membre de la classe?

De la norme, section 8.5 [dcl.init] :

Initialiser par défaut un object de type T signifie:

  • si T est un type de classe (éventuellement qualifié cv) (clause 9), le constructeur par défaut de T est appelé (et l’initialisation est mal formée si T n’a pas de constructeur par défaut accessible);

  • si T est un type de tableau, chaque élément est initialisé par défaut ;

  • sinon, aucune initialisation n’est effectuée.

aussi section 12.6.2 [class.base.init] :

Dans un constructeur non délégué, si un membre de données non statique ou une classe de base donnée n’est pas désigné par un mem-initializer-id (y compris le cas où il n’y a pas de liste mem-initializer-list car le constructeur n’a pas d’ initialisateur ctor ) et l’entité n’est pas une classe de base virtuelle d’une classe abstraite (10.4), alors

  • si l’entité est un membre de données non statique doté d’un initialiseur entre accolades ou égales , l’entité est initialisée comme spécifié en 8.5;
  • sinon, si l’entité est un membre variant (9.5), aucune initialisation n’est effectuée;
  • sinon, l’entité est initialisée par défaut (8.5).

Donc, comme le type d’élément est char , lorsque chaque élément est initialisé par défaut , aucune initialisation n’est effectuée. Le contenu est laissé avec des valeurs arbitraires.

À moins, bien sûr, qu’il s’agisse d’un membre d’une instance de la classe et que l’instance a une durée de stockage statique. Ensuite, toute l’instance est initialisée à zéro , les membres du groupe et tout avant le début de l’exécution.

Cela dépend de nombreux facteurs que vous avez oublié de mentionner.

Si votre Test n’a pas de constructeur défini par l’utilisateur ou que votre constructeur ne fait aucun effort pour initialiser le tableau, et que vous déclarez l’object de type Test comme

 Test test; // no initializer supplied 

alors, il se comportera exactement de la même manière que celle décrite ci-dessus. Pour un object automatique (local), le contenu du tableau restra imprévisible. Pour un object statique, le contenu est garanti à zéro.

Si votre classe a un constructeur défini par l’utilisateur, tout dépendra de ce que fait le constructeur. Encore une fois, gardez à l’esprit que les objects statiques sont toujours initialisés à zéro avant qu’un constructeur n’ait la possibilité de faire quoi que ce soit.

Si votre classe est un agrégat, le contenu peut dépendre de l’initialiseur d’agrégat que vous avez fourni dans la déclaration d’object. Par exemple

 Test test = {}; 

initialisera le tableau à zéro même pour un object automatique (local).

Je crois que si vous ne l’initialisez pas lorsque vous le déclarez, vous pouvez le régler sur n’importe quoi. Parfois, c’est une adresse ou une valeur aléatoire.

La meilleure pratique consiste à initialiser après la déclaration.