264 votes

Pourquoi devrais-je préfère utiliser la liste d'initialisation de membre?

Je suis partie à l'aide de l'initialisation de membre listes avec ma constructeurs... mais j'ai depuis longtemps oublié les raisons de cette...

Utilisez-vous membre de l'initialisation des listes dans votre constructeur? Si oui, pourquoi? Si non, pourquoi pas?

312voto

Adam Rosenfield Points 176408

Pour POD membres de la classe, cela ne fait aucune différence, c'est juste une question de style. Pour les membres de la classe qui sont des classes, alors il évite inutile de faire appel à un constructeur par défaut. Considérer:

class A
{
public:
    A() { x = 0; }
    A(int x_) { x = x_; }
    int x;
};

class B
{
public:
    B()
    {
        a.x = 3;
    }
private:
    A a;
};

Dans ce cas, le constructeur B va appeler le constructeur par défaut pour A, puis initialiser a.x à 3. Une meilleure façon serait de Bs'constructeur à appeler directement As'constructeur dans la liste d'initialiseur:

B()
  : a(3)
{
}

Ce ne serait qu'appelez As' A(int) constructeur et non par son constructeur par défaut. Dans cet exemple, la différence est négligeable, mais imaginez si vous voulez qu' As'constructeur par défaut n'a plus, comme l'allocation de la mémoire ou de l'ouverture de fichiers. Vous ne voudriez pas faire inutilement.

En outre, si une classe n'a pas de constructeur par défaut, ou vous avez un const variable membre, vous devez utiliser une liste d'initialisation:

class A
{
public:
    A(int x_) { x = x_; }
    int x;
}

class B
{
public:
    B() : a(3), y(2)  // 'a' and 'y' MUST be initialized in an initializer list;
    {                 // it is an error not to do so
    }
private:
    A a;
    const int y;
};

47voto

Naveen Points 37095

Outre l'exécution des raisons mentionnées ci-dessus, si votre classe stocke les références aux objets passés comme paramètres de constructeur ou votre classe a const variables, alors vous n'avez pas le choix, sauf à l'aide d'initialiseur de listes.

15voto

laalto Points 50581

L'initialisation est préférable d'affectation.

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

12voto

mloskot Points 13971

Ensuite pour les problèmes de performances, il y a un autre très important que je ne voudrais appeler du code de la maintenabilité et évolutivité.

Si T est de la GOUSSE et de commencer préférant l'initialisation de la liste, alors si on a le temps T qui va changer à un non-type de POD, vous n'aurez pas besoin de changer quoi que ce soit autour de l'initialisation de façon à éviter le constructeur appelle parce qu'il est déjà optimisé.

Si le type T n'ont constructeur par défaut et un ou plusieurs défini par l'utilisateur des constructeurs et une fois que vous décidez de supprimer ou de masquer le défaut de l'une, puis si l'initialisation de la liste a été utilisé, vous n'avez pas besoin de code de mise à jour si votre définis par l'utilisateur constructeurs, car ils sont déjà mis en œuvre correctement.

Même avec const membres ou de référence, les membres, disons d'abord que T est défini comme suit:

struct T
{
    T() { a = 5; }
private:
    int a;
};

Ensuite, vous décidez de vous qualifier en tant que const, si vous souhaitez utiliser la liste d'initialisation depuis le début, alors ce n'était qu'un simple changement de ligne, mais ayant la T défini comme ci-dessus, il faut aussi creuser le constructeur définition de supprimer l'affectation:

struct T
{
    T() : a(5) {} // 2. that requires changes here too
private:
    const int a; // 1. one line change
};

Ce n'est pas un secret que l'entretien est beaucoup plus facile et moins sujettes à l'erreur si le code n'a pas été écrite par un "code de singe", mais par un ingénieur qui prend des décisions basées sur une considération plus profonde sur ce qu'il fait.

6voto

Martin Rennix Points 1089

Mais rappelez-vous que l'ordre de l'initialisation est l'ordre dans lequel les membres sont déclarées dans la classe, pas l'ordre de la liste d'initialisation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X