8
votes

Comment les champs de classe peuvent-ils être initialisés?

Un peu d'une question de base, mais j'ai du mal à suivre une réponse définitive.

Initializer répertorie le moyen pour initialiser les champs de classe en C ++, en dehors de l'affectation des méthodes ?

Si j'utilise la mauvaise terminologie, voici ce que je veux dire: xxx

edit : en particulier, Y a-t-il une bonne façon d'initialiser un champ d'installation avec un initialiseur de structure? Par exemple: xxx


3 commentaires

En C ++, l'instance de struct avec des accolades vides ne sera normalement pas mise à zéro, mais contiendra des valeurs de déchets. Des exceptions peuvent être dans un environnement de débogage ou une situation contrôlée de la même manière.


@Seinarsson - Oh ... Avez-vous une référence pour cela? Les accolades vides sont recommandées sur le Web pour initialiser les structures en C ++.


Attendez, maintenant je ne suis pas si certain. J'ai trouvé des gens sur le Web en disant que je me trompe mais aucune définition formelle pour le motif {}. La question suivante implique que les catégories de structures en C ++ ont la réduction des constructeurs par défaut, lorsqu'ils sont utilisés dans une initialiseur de classe (voir la deuxième réponse) Stackoverflow.com/Questtions/112085/... ne pas tenir compte de mon commentaire ci-dessus jusqu'à ce que je puisse clarifier cela.


4 Réponses :


0
votes

La manière recommandée et préférée consiste à initialiser tous les champs du constructeur, comme dans votre premier exemple. Ceci est également valable pour les structures. Voyez ici: Initialisation de la structure statique TM dans une classe


0 commentaires

3
votes

Les membres statiques peuvent être initialisés différemment:

struct stype {
const char *str;
int val;
};

stype initialSVal = {
"hi",
7
};

class Test {
public:
    Test(): s(initialSVal) {}
    stype s;
};


0 commentaires

6
votes

en C ++ x0 La deuxième manière devrait également fonctionner.

Les initialiszer répertorie le seul moyen d'initialiser les champs de classe en C ++?

Dans votre cas avec votre compilateur: Oui.


0 commentaires

1
votes

juste pour mentionner que dans certains cas, vous n'avez d'autre choix que d'utiliser des listes d'initialiseur pour définir la valeur d'un membre sur la construction:

class A
{
 private:

  int b;
  const int c;

 public:

 A() :
  b(1),
  c(1)
 {
  // Here you could also do:
  b = 1; // This would be a reassignation, not an initialization.
        // But not:
  c = 1; // You can't : c is a const member.
 }
};


0 commentaires