给定代码示例:
class B {
//Some contents.
};
class C {
private:
B& b;
};
class A {
private:
B b;
C c;
};
C类有一个b的引用,所以需要用它来初始化。类 A 包含 B 的实例和 C 的实例。
我的问题是:我可以用 A 中的 B 实例初始化 A 中的 C 实例吗(假设我不厌其烦地将构造函数放入其中)?其次,我是否需要对 A 中的 B 执行任何显式初始化,还是因为它是类中的类类型而默认初始化?
最佳答案
成员变量按照它们在类声明中声明的顺序进行初始化(即使它们在构造函数的初始化列表中的顺序不同),所以是的,到时候c
正在初始化,b
将被初始化,您可以使用b
来初始化c
。
正如 Ricardo Cardenes 指出的那样,即使您在类定义中的 b
之前声明了 c
(这意味着您将传递 C::C
对未初始化的 B
的引用)但是,如果您使用 C::C
中的对象,则会导致未定义的行为。首先声明 b
更安全,因为虽然您现在可能不会在 C::C
中使用 b
,但您将来可能会忘记它引用指向未初始化的 B
,并导致 UB。
不,您不必显式初始化 b
(除非它是 POD ),除非您不希望它是默认构造的。所以这段代码就是你想要的(同样,如果 B
不是 POD):
A::A() : c(b) { }
关于c++ - 初始化顺序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8808883/