Que les données membres soient créées avant l'appel au constructeur peut être un inconvénient. Par exemple, on peut vouloir une initialisation spécifique de telle ou telle donnée membre.
On peut passer des arguments aux membres à initialiser par l'intermédiaire de liste d'initialisation de membres.
class C{ public: C(); C(int n,int m):ac2(n),ac1(m){i=0;} private: B bc; A ac1; A ac2; int i; }Dans ce cas,
C c(2,3)
provoquera (dans cet ordre).
bc
:
A::A()
initialisation de ba
B::B()
initialisation de bc
ac1
:
A::A(m)
initialisation de ac1
ac2
:
A::A(n)
initialisation de ac2
:
class X{ const int a; public: X(){a=0;} //non!! X(int i):a(i){}; //ok };
Le compilateur appellera les divers constructeurs des données membres (dans l'ordre de leur apparition dans la définition de la classe).