给出代码示例:
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)所说,即使你声明它仍然有效c
before b
在类定义中(这意味着你将通过C::C
对未初始化的引用B
)但是,如果您这样做,则会导致未定义的行为use里面的物体C::C
。申报更安全b
首先,因为虽然你可能不使用b
inside C::C
现在,您将来可能会忘记引用引用的是未初始化的B
,并引起UB。
不,您不必显式初始化b
(除非是POD https://stackoverflow.com/questions/146452/what-are-pod-types-in-c)除非您不希望它被默认构造。所以这段代码就是你想要的(同样,如果B
不是 POD):
A::A() : c(b) { }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)