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).
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.
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
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.
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
{}
};
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.