2010-07-16 4 views
6

Un peu d'une question de base, mais j'ai de la difficulté à trouver une réponse définitive.Comment les champs de classe peuvent-ils être initialisés?

L'initialiseur répertorie-t-il les seulement façon d'initialiser les champs de classe en C++, à l'exception de l'affectation dans les méthodes?

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

class Test 
{ 
public: 
    Test(): MyField(47) { } // acceptable 
    int MyField; 
}; 

class Test 
{ 
public: 
    int MyField = 47; // invalid: only static const integral data members allowed 
}; 

EDIT: en particulier, est-il un bon moyen d'initialiser un champ struct avec un initialiseur struct? Par exemple:

struct MyStruct { int Number, const char* Text }; 

MyStruct struct1 = {}; // acceptable: zeroed 
MyStruct struct2 = { 47, "Blah" } // acceptable 

class MyClass 
{ 
    MyStruct struct3 = ??? // not acceptable 
}; 
+0

En C++ l'instance struct avec des accolades vides normalement pas être remis à zéro, mais contiendra des valeurs de garbage. Les exceptions peuvent être dans un environnement de débogage ou dans une situation similaire. –

+0

@SEinarsson - oh ... avez-vous une référence pour ça? Les accolades vides sont recommandées sur tout le web pour l'initialisation des structures en C++. –

+0

Attendez, maintenant je ne suis pas si sûr. J'ai trouvé des gens sur le web disant que je me trompe mais pas de définition formelle pour le pattern {}. La question suivante implique que les classes structs en C++ ont des constructeurs par défaut de mise à zéro, lorsqu'elles sont utilisées dans un initialiseur de classe (voir la deuxième réponse) http://stackoverflow.com/questions/112085/is-this-c-structure-initialization- Ne pas tenir compte de mon commentaire ci-dessus jusqu'à ce que je puisse clarifier cela. –

Répondre

5

En C++ x0, la seconde méthode devrait également fonctionner.

Les listes d'initialisation sont-elles le seul moyen d'initialiser les champs de classe en C++?

Dans votre cas avec votre compilateur: Oui.

0

La méthode recommandée et préférée consiste à initialiser tous les champs dans le constructeur, exactement comme dans votre premier exemple. Ceci est également valable pour les structures. Voir ici: Initializing static struct tm in a class

3

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

class Test { 
    .... 
    static int x; 
}; 

int Test::x = 5; 

Je ne sais pas si vous appelez ce « gentil », mais vous pouvez initialiser les membres de la struct assez proprement comme ceci:

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

stype initialSVal = { 
"hi", 
7 
}; 

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

"Nice" est subjective bien sûr. Merci de m'avoir montré comment initialiser les structures - je trouve cela plutôt désagréable, mais étant donné que je n'ai pas le choix ... :) –

1

simplement mentionner que, dans certains cas, vous avez pas d'autre choix que d'utiliser des listes de initialiseur pour définir la valeur d'un membre de 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. 
} 
}; 
Questions connexes