构造函数初始化列表 - 这行得通吗?

Constructor Initializer List - will this work?

在您的帮助下,我可以使用构造函数初始化列表解决我在这个最小示例 () 中描述的问题。

在我的现实生活中,事情要困难一些。我的构造函数现在看起来像这样:

ClassC::ClassC() : _objectB(_objectA.getInt()) {
  _objectA = ClassA();
}

这行得通吗?编译器不会 return 任何错误。然而,_objectB 被初始化为 _objectA 的值,它在下面的行中被初始化。那么 _objectA.getInt() return 如何成为一个有效值呢?

如果它不起作用,我怎样才能让它起作用?

如果_objectA 在_objectB 之前声明,那么将调用_objectA 的默认构造函数。并且,_objectB 将使用来自 _objectA 的 getInt() 值进行初始化。之后,在构造函数的主体中,_objectA 通过赋值运算符设置为 ClassA 的默认构造函数——这是不需要的。

如果 _objectB 在 _objectA 之前声明,则 IDK...它可能取决于编译器实现。

无论哪种方式,您基本上都在初始化 _objectA 两次。

如果_objectA声明为

class ClassC
{
    ClassA _objectA;
    ClassB _objectB;

    public:
    ClassC();
}

它会起作用,因为 _objectA 已经初始化(使用默认构造函数),您只需稍后重新分配一个新的 class 即可,这与 _objectB 无关初始化。


但是,正如@πìντα ῥεῖ 所建议的那样,最好使用

ClassC::ClassC() : _objectA(), _objectB(_objectA.getInt()) {}

这将初始化 _objectA,然后将其用于 _objectB 初始化。

So how would _objectA.getInt() return a valid value?

很可能是的。如果使用默认构造函数初始化 objectA 以产生有效值,则它已经被隐式构造(如果声明出现在 objectB 之前)。

构造函数体中的赋值是多余的。

另外最好写成:

 ClassC::ClassC() : _objectA(), _objectB(_objectA.getInt()) {}

在成员初始值设定项列表中明确说明。

Class 成员总是按照声明的顺序初始化,所以假设 ClassC 看起来像

class ClassC
{
    ClassA _objectA;
    ClassB _objectB;

public:
    ClassC();
//...
};

那么你的构造函数等同于

ClassC::ClassC() : _objectA(), _objectB(_objectA.getInt()) {
    _objectA = ClassA();
}

如您所见,_objectA_objectB 之前初始化,然后您从构造函数主体中的匿名 ClassA 对象复制分配给 _objectA