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++!