web-dev-qa-db-fra.com

C ++: Où initialiser les variables dans le constructeur

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?

81
user542687

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é.

106
Greg Howell

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.

21
mwigdahl

Voir Mes constructeurs doivent-ils utiliser "listes d'initialisation" ou "affectation"?

En bref: dans votre cas particulier, cela ne change rien. Mais:

  • pour les membres de classe/struct avec constructeurs, il peut être plus efficace d’utiliser l’option 1.
  • seule l'option 1 vous permet d'initialiser des 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 à l'aide de leur constructeur
  • seule l'option 2 vous permet d'initialiser un tableau ou des structures qui n'ont pas de constructeur.

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++.

10

L'option 1 vous permet d'utiliser un lieu spécifié précisément pour l'initialisation explicite des variables de membre.

3
Diego Sevilla

Il y a beaucoup d'autres raisons. Si possible, vous devez toujours initialiser toutes les variables membres de la liste d'initialisation.

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6

2
Salgar

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).

Pourquoi les membres const doivent-ils être initialisés dans l'initialiseur du constructeur plutôt que dans son corps?

1
Avada Kedavra