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?

72
demandé sur Community 2011-07-26 01:11:26

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

98
répondu Greg Howell 2016-03-15 14:42:16

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.

19
répondu mwigdahl 2016-05-21 23:02:13

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

9
répondu Raphaël Saint-Pierre 2015-11-16 22:35:21

L'Option 1 vous permet d'utiliser un endroit spécifié exactement pour initialiser explicitement les variables de membre.

3
répondu Diego Sevilla 2011-07-25 21:14:43

Il y a beaucoup d'autres raisons. Vous devriez toujours initialiser toutes les variables de membre dans la liste d'initialisation, si possible.

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

2
répondu Salgar 2011-07-25 21:18:29

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

pourquoi les éléments const doivent-ils être intialisés dans l'initialiseur du constructeur plutôt que dans sa carrosserie?

1
répondu Avada Kedavra 2017-05-23 12:18:09