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的任何显式初始化,还是默认初始化,因为它是类中的类类型?
成员变量按照它们在类声明中声明的顺序进行初始化(即使你在构造函数的初始化列表中以不同的顺序使用它们),所以是的,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)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |