在您的帮助下,我可以使用构造函数初始化列表解决我在此最小示例(use parameterized constructor in other classes constructor)中描述的问题。
在我的现实生活中,事情有点困难。我的构造函数现在看起来像这样:
ClassC::ClassC() : _objectB(_objectA.getInt()) {
_objectA = ClassA();
}
这会有用吗?编译器不会返回任何错误。但是,_objectB
初始化为_objectA
,在下面的行中初始化。那么_objectA.getInt()
将如何返回有效值?
如果它不起作用,我怎样才能使它工作?
答案 0 :(得分:2)
如果在_objectB之前声明了_objectA,那么将调用_objectA的默认构造函数。并且,_objectB将使用_objectA中的getInt()值进行初始化。之后,在构造函数的主体中,_objectA通过赋值运算符设置,使用ClassA的默认构造函数 - 这是不需要的。
如果在_objectA之前声明_objectB,那么IDK ......它可能依赖于编译器实现。
无论哪种方式,你基本上都是在初始化_objectA两次。
答案 1 :(得分:2)
如果_objectA
被声明为
class ClassC
{
ClassA _objectA;
ClassB _objectB;
public:
ClassC();
}
它会起作用,因为_objectA
已经初始化(使用默认构造函数),你只需稍后重新分配一个新类,这与_objectB
初始化无关。
然而,正如@πάνταῥεῖ建议最好使用
ClassC::ClassC() : _objectA(), _objectB(_objectA.getInt()) {}
将初始化_objectA
,然后将其用于_objectB
初始化。
答案 2 :(得分:2)
那么_objectA.getInt()将如何返回有效值?
最有可能是的。如果使用默认构造函数初始化objectA
以生成有效值,则它已隐式构造(如果声明出现在objectB
之前)。
构造函数体中的赋值是多余的。
最好还是写一下:
ClassC::ClassC() : _objectA(), _objectB(_objectA.getInt()) {}
在成员初始化列表中明确说明。
答案 3 :(得分:2)
类成员总是按照声明的顺序初始化,所以假设ClassC
看起来像
class ClassC
{
ClassA _objectA;
ClassB _objectB;
public:
ClassC();
//...
};
那么你的构造函数等同于
ClassC::ClassC() : _objectA(), _objectB(_objectA.getInt()) {
_objectA = ClassA();
}
如您所见,_objectA
在_objectB
之前初始化,然后您从构造函数体内的匿名_objectA
对象中复制 - 分配给ClassA
。