web-dev-qa-db-fra.com

appel du constructeur d'un membre de classe dans le constructeur

Puis-je appeler le constructeur d'un membre dans le constructeur de ma classe?

disons si j'ai un membre bar de type classe foo dans ma classe MClass. Puis-je appeler constructeur de bar dans le constructeur de MClass? Sinon, comment puis-je initialiser ma barre de membres?

C'est un problème d'initialisation des membres en composition (agrégation).

24
shampa

Oui, certainement! C'est à cela que sert la liste d'initialisation du constructeur. Il s'agit d'une fonctionnalité essentielle dont vous avez besoin pour initialiser des membres qui n'ont pas de constructeurs par défaut, ainsi que des constantes et des références:

class Foo
{
  Bar x;     // requires Bar::Bar(char) constructor
  const int n;
  double & q;
public:
  Foo(double & a, char b) : x(b), n(42), q(a) { }
  //                      ^^^^^^^^^^^^^^^^^^^
};

Vous avez en outre besoin de la liste d'initialisation pour spécifier un constructeur non par défaut pour les classes de base dans les constructeurs de classes dérivés.

37
Kerrek SB

Oui, vous pouvez:

#include <iostream>

using std::cout;
using std::endl;

class A{
public:
    A(){
        cout << "parameterless" << endl;
    }

    A(const char *str){
        cout << "Parameter is " << str <<endl;
    }
};

class B{
    A _argless;
    A _withArg;

public:
    // note that you need not call argument-less constructor explicitly.
    B(): _withArg("42"){
    }
};

int main(){
    B b;

    return 0;
}

La sortie est:

parameterless
Parameter is 42

Voir ceci sur ideone.com

6
elder_george

Comme ça:

class C {
  int m;

public:

  C(int i):
    m(i + 1) {}

};

Si votre constructeur membre veut des paramètres, vous pouvez les transmettre. Il peut s'agir d'expressions créées à partir des paramètres du constructeur de classe et de types déjà initialisés.

Remember: les membres sont initialisés dans l'ordre dans lequel ils sont déclarés dans la classe, pas dans l'ordre dans lequel ils apparaissent dans la liste d'initialisation.

3
phs

Grâce à la liste d'initialisation, si la classe de base n'a pas de constructeur par défaut.

struct foo{
   foo( int num )
   {}
};

struct bar : foo {
   bar( int x ) : foo(x)
               // ^^^^^^ initializer list
   {}
};
3
Mahesh

Oui, vous pouvez. Cela se fait dans la liste d'initialisation de votre classe. Par exemple:

class MClass 
{

  foo bar;

public:

  MClass(): bar(bar_constructor_arguments) {};
}

Cela va construire bar avec les arguments passés. Normalement, les arguments seront d'autres membres de votre classe ou des arguments qui ont été passés à votre constructeur. Cette syntaxe est requise pour tous les membres qui n'ont pas de constructeurs sans argument.

2
Dave S