Given the code sample:
class B {
//Some contents.
};
class C {
private:
B& b;
};
class A {
private:
B b;
C c;
};
Class C has a reference to a b, so it needs to be initialized with it. Class A contains an instance of B and an instance of C.
My question is: Can I initialize the C instance in A with the B instance in A (assuming I did bother to put the constructors in)? Secondly, do I need to perform any explicit initialization of the B in A, or is it default initialized since its a class type within a class?
Member variables are initialised in the order that they are declared in the class declaration (even if you have them in a different order in the initialisation list of the constructor), so yes, by the time
c
is being initialised,b
will be initialised, and you can useb
to initialisec
.As Ricardo Cardenes notes, it will still work even if you declare
c
beforeb
in the class definition (which means you will passC::C
a reference to an uninitialisedB
) however you cause undefined behaviour if you use the object insideC::C
. It's safer to declareb
first, because although you may not useb
insideC::C
now, you might in the future and forget that the reference refers to an uninitialisedB
, and cause UB.And no, you do not have to explicitly initialise
b
(unless it is POD) unless you don't want it to be default-constructed. So this code would be what you want (again, ifB
isn't POD):