构造函数初始化列表 - 这会有效吗?

时间:2016-11-17 22:08:13

标签: c++ constructor initializer-list

在您的帮助下,我可以使用构造函数初始化列表解决我在此最小示例(use parameterized constructor in other classes constructor)中描述的问题。

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

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

这会有用吗?编译器不会返回任何错误。但是,_objectB初始化为_objectA,在下面的行中初始化。那么_objectA.getInt()将如何返回有效值?

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

4 个答案:

答案 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