2010-12-08 31 views
11

En C++ 98confusion dans la compréhension des normes C++

12.6.2/4: Après l'appel à un constructeur pour la classe X a terminé, si un membre de X est ni spécifié dans le constructeur de mem-initialiseurs, ni initialisée par défaut, ni initialisée lors de l'exécution du corps du constructeur, le membre a une valeur indéterminée.

Qu'est-ni initialisées lors de l'exécution du corps du constructeur signifie? Un membre peut-il être initialisé dans le corps du constructeur?

Répondre

11

ni initialisé lors de l'exécution du corps du constructeur n'est pas correct à mon humble avis.

Les formulations ont été modifiés dans 03 C++ de ni initialisé (en C++ 98) à ni donné une valeur

Après l'appel à un constructeur pour la classe X a terminé , si un membre de X n'est ni spécifié dans les initialiseurs du constructeur, ni initialisé par défaut, ni initialisé par la valeur, ni donné une valeur pendant l'exécution du corps du constructeur, le membre a une valeur indéterminée.

+0

Je n'ai pas de copie de C++ 03. D'où puis-je l'obtenir? – Bazinga

+0

IOW dans le fragment "ni initialisé lors de l'exécution du corps du constructeur", la norme C++ 03 utilise le mot "initialisé" de manière informelle pour signifier "assigné une valeur". –

+3

@Bazinga: Vous ne pouvez pas l'obtenir gratuitement. –

3

C'est en fait très simple. Les membres de classe/struct peuvent inclure des objets avec des constructeurs par défaut, mais s'ils ne le font pas, et que vous ne leur donnez pas de valeur dans la liste des initialiseurs, vous ne les placez pas dans le corps du constructeur. occuper - tout ce qui leur a été enlevé de la pile ou du tas - aura toujours de vieilles ordures, c'est-à-dire une valeur indéterminée.

Considérez:

struct X 
{ 
    X() : x1(1) { x2 = 2; } 
    double x1, x2, x3; 
    std::string x4; 
}; 

Ici, x1 et x2 sont initialisés explicitement par le constructeur de X et x4 - être un std::string - cependant, est par défaut construit pour être ""/longueur 0. , pourrait être quelque chose - et ne devrait pas être lu avant d'avoir été défini (c'est un comportement indéfini et peut vraiment mordre sur certains systèmes - considérez que le motif binaire de la mémoire qu'il occupe peut même ne pas être une valeur valide pour un double de cela pourrait déclencher une exception/interruption/interruption du processeur).

+0

Je n'ai pas de copie de C++ 03. D'où puis-je l'obtenir? – Bazinga

+0

Seul le brouillon final est disponible gratuitement - un google rapide permet de trouver de nombreuses sources - par ex. http://www.kuzbass.ru:8086/docs/isocpp/.C'est généralement le plus pratique pour moi, mais vous pouvez commander une copie officielle de la version finale pour une somme modique (20 ou 30 dollars US) ... Je ne me souviens pas exactement d'où. –

+1

@Bazinga: voir [6.3] sur http://www.parashift.com/c++-faq-lite/big-picture.html#faq-6.13 pour obtenir des instructions sur l'obtention d'une copie de la norme. –