By the time execution reaches inside of a constructor (just passing the opening brace), all the class data members have already been constructed. This is the reason you have to initialize any const or reference data members of a class in the initializer lists. Both const and reference data variables cannot be changed once created, so they will have to be created correctly in the first place. The way to do that is calling the appropriate constructors they have inside initialization lists.

One other side effect of initialization lists is that initializing class data members inside a ctor and not inside initialization list will almost always be less efficient. This is true if you are planning to change the state of the data member right after creating them. Inside the constructor you would already have a complete data member and would change its state using operator=() rather than creating it correctly in initialization list in the first place.