92 votes

Initialisation des valeurs par défaut dans une structure

Si j'avais besoin d'initialiser seulement quelques valeurs sélectionnées 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 finirais par en avoir une struct article appelé bar avec des éléments bar.a = true , bar.b = true et un indéfini bar.c ?

281voto

Erik van Velzen Points 342

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 : ces initialisateurs sont appelés brace-or-equal-initializers (parce que vous pouvez également utiliser l'initialisation brace au lieu du signe égal). Ce n'est pas seulement pour les agrégats : vous pouvez l'utiliser dans les définitions de classes normales. Ceci a été ajouté dans C++11.

45voto

taocp Points 14822

Oui. bar.a y bar.b sont définis comme vrais, mais bar.c est indéfinie. Cependant, certains compilateurs lui attribuent la valeur false.

Voir un exemple en direct ici : struct demo

Selon la section 8.5.12 de la norme C++ :

si aucune initialisation n'est effectuée, un objet avec durée de stockage automatique ou dynamique 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), seulement mondial (toutes les variables de stockage statiques) ont une valeur par défaut de zéro si elles ne sont pas explicitement initialisées.

Si vous ne voulez pas vraiment d'indéfini bar.c pour commencer, vous devez également l'initialiser comme vous l'avez fait pour la fonction bar.a y bar.b .

10voto

Nicola Points 641

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 est indéfini, et sa valeur dépend du compilateur (alors que a et b ont été mis à true).

3voto

Anamnian Points 330

Une initialisation explicite par défaut peut aider :

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

Comportement bool a {} est identique à bool b = bool(); et retourner false .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X