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
cis being initialised,bwill be initialised, and you can usebto initialisec.As Ricardo Cardenes notes, it will still work even if you declare
cbeforebin the class definition (which means you will passC::Ca reference to an uninitialisedB) however you cause undefined behaviour if you use the object insideC::C. It's safer to declarebfirst, because although you may not usebinsideC::Cnow, 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, ifBisn't POD):