L'appel d'une fonction membre suppose que l'objet existe au moment de l'appel,
et donc que toutes
les données membres aient été créées; cette règle s'applique aussi aux
constructeurs. Cela signifie qu'à l'intérieur du corps du constructeur
(après '{
'), toutes les données membres ont déjà été créées.
Pour créer un objet d'un type quelconque, le compilateur procédera récursivement ainsi:
class A{ public: A(){ //... } A(int i){ a1=a2=i; } private: int a1; int a2; }; //... A x;Une déclaration
A x;
va d'abord créer
un objet de type A
pour cela le
compilateur va faire les allocations pour a1
et a2
, ensuite il appellera le constructeur membre
par défaut A::A()
. D'une manière générale, une fois
dans le corps d'une fonction membre et en particulier
d'un constructeur, l'objet doit déjà avoir été créé.
class B{ public:B(){ //... } private: int b; A ba; }; //... B y;
De la même façon, B y;
va créer un objet de la
classe B
, et pour cela
allouer ce qu'il faut pour
b
, et créer une donnée membre ba de la classe A,
ce qui se fera comme indiqué juste au-dessus ; on aura donc
d'abord un appel de A::A()
puis de B::A()
.