C++: où initialiser les variables dans le constructeur [dupliquer]
possibilité de dupliquer:
c++ initialization lists
Quels sont les avantages et les inconvénients de l'initialisation des variables à l'option 1 par rapport à l'option 2?
class MyClass
{
public:
MyClass( float f, char a );
private:
float mFloat;
char mCharacter;
bool mBoolean;
int mInteger;
};
MyClass::MyClass( float f, char a ) : mFloat( f ), mBoolean( true ) // option 1.
{
// option 2
mCharacter = a;
mInteger = 0;
}
Edit: Pourquoi l'option 2 est-elle si courante?
6 réponses
en bref, toujours préférer les listes d'initialisation quand c'est possible. 2 raisons:
-
si vous ne mentionnez pas une variable dans la liste d'initialisation d'une classe, le constructeur l'initialisera par défaut avant d'entrer le corps du constructeur que vous avez écrit. Cela signifie que l'option 2 conduira à ce que chaque variable soit écrite deux fois, une fois pour l'initialisation par défaut et une fois pour l'affectation dans le corps du constructeur.
-
aussi, comme l'ont mentionné mwigdahl et avada dans d'autres réponses, les membres du const et les membres de référence peuvent seulement être initialisés dans une liste d'initialisation.
notez aussi que les variables sont toujours initialisées dans l'ordre où elles sont déclarées dans la déclaration de classe, et non dans l'ordre où elles sont listées dans une liste d'initialisation (avec les avertissements appropriés activés un compilateur vous avertira si une liste est écrite de la commande). De la même façon, les destructeurs appelleront les destructeurs membres dans l'ordre opposé, du dernier au premier dans la déclaration de classe, après que le code dans le destructeur de votre classe a exécuté.
bien qu'il ne s'applique pas à cet exemple spécifique, L'Option 1 vous permet d'initialiser les variables membres de type de référence (ou const
type, comme indiqué ci-dessous). L'Option 2 ne l'est pas. En général, L'Option 1 est la plus puissante.
Voir mon constructeurs utiliser "initialisation de la liste" ou "affectation"?
brièvement: dans votre cas spécifique, il ne change rien. Mais:
- pour les membres de classe/structure avec des constructeurs, il peut être plus efficace d'utiliser l'option 1.
- seule l'option 1 vous permet d'initialiser les membres de référence.
- seule l'option 1 vous permet d'initialiser les membres const
- seule l'option 1 vous permet d'initialiser les classes de base en utilisant leur constructeur
- seule l'option 2 permet d'initialiser ou des structures qui n'ont pas de constructeur.
Ma deviner pourquoi l'option 2 est plus commune est que l'option 1 n'est pas connu, pas plus que ses avantages. La syntaxe de l'Option 2 semble plus naturelle pour le nouveau programmeur C++.
L'Option 1 vous permet d'utiliser un endroit spécifié exactement pour initialiser explicitement les variables de membre.
Il y a beaucoup d'autres raisons. Vous devriez toujours initialiser toutes les variables de membre dans la liste d'initialisation, si possible.
L'Option 1 vous permet d'initialiser les membres const
. Cela ne peut pas être fait avec l'option 2 (comme ils sont assignés, non initialisés).