2010-04-27 13 views

Répondre

5

Cela ressemble, il est censé être un constructeur; si elle est, il ne devrait avoir aucun type de retour, et il a besoin d'avoir le même nom que la classe, par exemple,

myClass::myClass() 
    : member1(0), member2(1) 
{ 

} 

Seul un constructeur peut avoir une liste d'initialiseur; vous ne pouvez pas déléguer ce type d'initialisation à une fonction Init.

Tous les membres non statiques peuvent être initialisés dans la liste d'initialisation du constructeur. Tous les membres const et référence doivent être initialisés dans la liste d'initialisation du constructeur. Toutes choses étant égales, you should generally prefer to initialize all members in the constructor initializer list, plutôt que dans le corps du constructeur (parfois il n'est pas possible ou c'est maladroit d'utiliser la liste d'initialisation, auquel cas, vous ne devriez pas l'utiliser, évidemment).

+0

ok, c'est logique. Mais j'ai déjà reçu des erreurs indiquant que seuls les membres const statiques peuvent être déclarés dans une classe. Cela signifie-t-il que seuls les membres statiques et constants peuvent recevoir une valeur dans la déclaration de classe, en opposition à la liste des initialiseurs ou au corps du constructeur. – numerical25

+1

Seuls les membres intégraux statiques peuvent être initialisés dans la déclaration de classe. Tout membre non-intégral doit être initialisé à l'extérieur de la déclaration de classe. (c'est-à-dire que vous ne pouvez pas initialiser un flottant statique dans la déclaration, mais un int, un short, un char ou un bool). –

0

Les membres de classes statiques n'appartiennent à aucun objet particulier. Un membre statique est partagé entre tous les objets de cette classe. Par conséquent, vous ne les initialisez pas dans un constructeur - cela les réinitialiserait trop souvent, par exemple.

Maintenant, il y a la question pourquoi seuls const membres de classe peuvent être initialisés dans la classe elle-même. La raison en est que la classe est très probablement dans un en-tête et que cet en-tête est inclus dans plusieurs unités de traduction. Cela provoque un problème pour le compilateur. Dans quelle unité de traduction (c'est-à-dire dans quel fichier objet) doit-il mettre l'initialisation réelle? Mais pour les simples, ce n'est pas grave. int const TWO = 2; n'a pas besoin d'une initialisation réelle dans une unité de traduction, le compilateur s'en souvient simplement.