我试图在c++中创建一个需要多个对象构造函数的对象。比如Foo()
和Foo(int)
,其中Foo(int)
调用Foo()
。简化后的代码如下:
#include <iostream>
class Foo{
private:
int iX;
public:
void printX(string sLabel){
cout << sLabel << " : " << " Foo::iX = " << Foo::iX << endl;
};
void setX(int iX){
Foo::iX = iX;
Foo::printX("setX(void) Method");
};
Foo(){
Foo::iX = 1;
Foo::printX("Foo(void) Constructor");
};
Foo(int iX){
Foo::setX(iX);
Foo::printX("Foo(int) Constructor");
Foo::Foo();
Foo::printX("Foo(int) Constructor");
};
};
int main( int argc, char** argv ){
Foo bar(2);
return 0;
}
其输出为
setX(void) Method : Foo::iX = 2
Foo(int) Constructor : Foo::iX = 2
Foo(void) Constructor : Foo::iX = 1
Foo(int) Constructor : Foo::iX = 2
结果表明setX
方法可以达到预期的效果。Foo::iX
在函数作用域内和作用域外都等于2
但是,当从Foo(int)
构造函数中调用Foo(void)
构造函数时,Foo::iX
仅在该构造函数中保持等于1
。一旦退出该方法,它就会返回到2
。
我的问题是2倍的:
- 为什么c++的行为是这样的(一个构造函数不能从另一个构造函数中调用没有被分配的值)?
- 如何创建多个构造函数签名,但没有多余的重复代码做同样的事情?
Foo::Foo(int)
中的Foo::Foo();
没有像您期望的那样调用当前对象的默认构造函数。它只是构造一个临时的Foo
,与当前对象无关。
您可以像这样使用委托构造函数(从c++ 11开始):
Foo(int iX) : Foo() {
// ...
};
请注意,Foo::Foo()
将在Foo::Foo(int)
的主体之前被调用。
避免重复代码的另一种方法是使用setX()
作为通用初始化方法。(如果不合适,也可以重新设置)
Foo() {
setX(1);
// ...
};
Foo(int iX) {
setX(iX);
// ...
};
如果你能使用c++ 11编译器,你可以使用委托构造函数。
// Use Foo(int) to initialize the object when default constructor is used.
Foo() : Foo(1) {}
一个构造函数可以从另一个构造函数内部调用。你只是忘了赋返回值。
*this = Foo::Foo();
对于问题2,您需要委托构造函数。
Foo(int iX) : Foo() {
...
}