初始化订单问题

Joh*_*0te 3 c++ initialization initialization-order

鉴于代码示例:

class B {
    //Some contents.
};

class C {
    private:
        B& b;
};

class A {
    private:
        B b;
        C c;
};
Run Code Online (Sandbox Code Playgroud)

C类引用了ab,因此需要用它进行初始化.A类包含B的实例和C的实例.

我的问题是:我可以使用A中的B实例初始化A中的C实例(假设我没有把构造函数放入其中)?其次,我是否需要在A中执行B的任何显式初始化,还是默认初始化,因为它是类中的类类型?

Set*_*gie 6

成员变量按照它们在类声明中声明的顺序进行初始化(即使你在构造函数的初始化列表中以不同的顺序使用它们),所以是的,c在初始化时,b将初始化,并且你可以b用来初始化c.

正如Ricardo Cardenes所指出的那样,即使您在类定义中声明c之前它仍然有效b(这意味着您将传递C::C对未初始化的引用B)但是如果您使用内部对象,则会导致未定义的行为C::C.首先声明是更安全的b,因为虽然你现在可能不会b在里面使用C::C,但是你可能在将来忘记引用是指未初始化的B,并导致UB.

不,除非您不希望它是默认构造的,否则您不必显式初始化b(除非它是POD).所以这段代码就是你想要的(再次,如果B不是POD):

A::A() : c(b) { }
Run Code Online (Sandbox Code Playgroud)