C++ 构造函数初始值设定项列表-这是否有效?

C++ 构造函数初始值设定项列表-这是否有效?,c++,constructor,initializer-list,C++,Constructor,Initializer List,在您的帮助下,我可以使用构造函数初始值设定项列表解决我在这个最小示例()中描述的问题 在我的现实生活问题中,事情有点困难。我的构造函数现在看起来像这样: ClassC::ClassC() : _objectB(_objectA.getInt()) { _objectA = ClassA(); } 这样行吗?编译器不会返回任何错误。但是,\u objectB使用值\u objectA初始化,该值在下面的行中初始化。那么\u objectA.getInt()如何返回有效值呢 如果它不工作,我如

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

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

ClassC::ClassC() : _objectB(_objectA.getInt()) {
  _objectA = ClassA();
}
这样行吗?编译器不会返回任何错误。但是,
\u objectB
使用值
\u objectA
初始化,该值在下面的行中初始化。那么
\u objectA.getInt()
如何返回有效值呢


如果它不工作,我如何使它工作?

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

如果_objectB在_objectA之前声明,那么IDK…它可能依赖于编译器实现


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

如果
\u objectA
声明为

class ClassC
{
    ClassA _objectA;
    ClassB _objectB;

    public:
    ClassC();
}
它将起作用,因为
\u objectA
已经初始化(使用默认构造函数),您稍后只需重新为其分配一个新类,这与
\u objectB
初始化无关


然而,作为@πάνταῥεῖ 建议最好使用

ClassC::ClassC() : _objectA(), _objectB(_objectA.getInt()) {}
这将初始化
\u objectA
,然后将其用于
\u objectB
初始化

那么_objectA.getInt()如何返回有效值呢

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

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

此外,最好写下:

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

要在成员初始值设定项列表中说明这一点。

类成员总是按照声明的顺序进行初始化,因此假设
ClassC
如下所示

class ClassC
{
    ClassA _objectA;
    ClassB _objectB;

public:
    ClassC();
//...
};
那么你的构造函数就相当于

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

如您所见,
\u objectA
\u objectB
之前初始化,然后从构造函数主体中的匿名
ClassA
对象复制赋值给
\u objectA

我会使用
ClassC::ClassC():\u objectA(),\u objectB(\u objectA.getInt()){
你的
ClassC
定义是什么:我不知道
\u objectA
是在哪里定义的。不是
\u objectB
中的一个,因为作用域不同。如果它也是
类C
的一个字段,那么您的类中有2个
\u objectA
,以后可能会混淆
ClassB\u objectB在其中。对不起,我没有在帖子中提到。谢谢你的回答。非常全面,非常有帮助!谢谢你的回答!它帮助我更好地理解C++!