构造函数初始化列表 - 这行得通吗?
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
。
在您的帮助下,我可以使用构造函数初始化列表解决我在这个最小示例 (
在我的现实生活中,事情要困难一些。我的构造函数现在看起来像这样:
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
。