Duplicate possible:
listes d'initialisation C++
Quels sont les avantages/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?
En bref, préférez toujours les listes d’initialisation lorsque cela 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 dans le corps du constructeur que vous avez écrit. Cela signifie que l'option 2 entraînera l'écriture de chaque variable deux fois, une fois pour l'initialisation par défaut et une fois pour l'affectation dans le corps du constructeur.
De plus, comme mentionné par mwigdahl et avada dans d'autres réponses, les membres const et les membres de référence peuvent niquement être initialisés dans une liste d'initialisation.
Notez également que les variables sont toujours initialisées dans l'ordre dans lequel elles sont déclarées dans la déclaration de classe, et non dans l'ordre où elles sont répertoriées dans une liste d'initialisation (avec les avertissements appropriés activés, un compilateur vous avertira si une liste est écrite dans le désordre). De même, les destructeurs appellent les destructeurs membres dans l'ordre inverse, du dernier au premier dans la déclaration de classe, une fois que le code du destructeur de votre classe a été exécuté.
Bien que cela ne s'applique pas à cet exemple spécifique, l'option 1 vous permet d'initialiser des variables de membre de type référence (ou const
type, comme indiqué ci-dessous). L'option 2 ne le fait pas. En général, l'option 1 est l'approche la plus puissante.
Voir Mes constructeurs doivent-ils utiliser "listes d'initialisation" ou "affectation"?
En bref: dans votre cas particulier, cela ne change rien. Mais:
Je suppose que la raison pour laquelle l'option 2 est plus courante est que l'option 1 n'est pas bien connue, 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 lieu spécifié précisément pour l'initialisation explicite des variables de membre.
Il y a beaucoup d'autres raisons. Si possible, vous devez toujours initialiser toutes les variables membres de la liste d'initialisation.
L'option 1 vous permet d'initialiser les membres const
. Cela ne peut pas être fait avec l'option 2 (car ils sont assignés, non initialisés).