Initialisation des valeurs par défaut dans une structure

Si je devais initialiser seulement quelques valeurs de sélection d’une structure C ++, cela serait-il correct:

struct foo { foo() : a(true), b(true) {} bool a; bool b; bool c; } bar; 

Ai-je raison de supposer que je me retrouverais avec un élément struct appelé bar avec les éléments bar.a = true , bar.b = true et un bar.c indéfini?

Oui. bar.a et bar.b sont définis sur true, mais bar.c n’est pas défini. Cependant, certains compilateurs le définiront sur false.

Voir un exemple en direct ici: struct demo

Conformément à la norme C ++ Section 8.5.12:

si aucune initialisation n’est effectuée, un object avec une durée de stockage automatique ou dynamic a une valeur indéterminée

Pour les types de données intégrés primitifs ( bool , char, wchar_t, short, int, long, float, double, long double), seules les variables globales (toutes les variables de stockage statiques) obtiennent la valeur par défaut de zéro si elles ne sont pas explicitement initialisées.

Si vous ne voulez pas vraiment que bar.c indéfini commence par, vous devriez également l’initialiser comme vous l’avez fait pour bar.a et bar.b

Vous n’avez même pas besoin de définir un constructeur

 struct foo { bool a = true; bool b = true; bool c; } bar; 

Pour clarifier, ils sont appelés initialiseurs de brace ou d’égale (car vous pouvez également utiliser l’initialisation des accolades au lieu du signe égal). Cela ne concerne pas uniquement les agrégats: vous pouvez l’utiliser dans les définitions de classes normales. Cela a été ajouté dans C ++ 11.

Vous pouvez le faire en utilisant un constructeur, comme ceci:

 struct Date { int day; int month; int year; Date() { day=0; month=0; year=0; } }; 

ou comme ça:

 struct Date { int day; int month; int year; Date():day(0), month(0), year(0){} }; 

Dans votre cas, bar.c n’est pas défini et sa valeur dépend du compilateur (alors que a et b étaient définis sur true).