Woo*_*ath 5 c++ methods constructor overloading object
我正在尝试用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;
}
Run Code Online (Sandbox Code Playgroud)
其输出是
setX(void) Method : Foo::iX = 2
Foo(int) Constructor : Foo::iX = 2
Foo(void) Constructor : Foo::iX = 1
Foo(int) Constructor : Foo::iX = 2
Run Code Online (Sandbox Code Playgroud)
结果表明setX方法按预期工作.Foo::iX等于2该函数范围的内部和外部.
但是,当Foo(void)从Foo(int)构造函数中调用构造函数时,仅在该构造函数中Foo::iX保持等于1.一旦退出该方法,它就会恢复原状2.
所以我的问题是双重的:
son*_*yao 11
Foo::Foo();in Foo::Foo(int)没有按预期调用当前对象的默认构造函数.它只构造一个临时的Foo,与当前对象无关.
您可以使用委托构造函数(自C++ 11),如下所示:
Foo(int iX) : Foo() {
// ...
};
Run Code Online (Sandbox Code Playgroud)
请注意,Foo::Foo()将在Foo::Foo(int)此处的主体之前调用.
避免重复代码的替代方法是setX()用作常见的初始化方法.(如果不合适,可以换一个新的.)
Foo() {
setX(1);
// ...
};
Foo(int iX) {
setX(iX);
// ...
};
Run Code Online (Sandbox Code Playgroud)
如果您能够使用 C++11 编译器,则可以使用委托构造函数。
// Use Foo(int) to initialize the object when default constructor is used.
Foo() : Foo(1) {}
Run Code Online (Sandbox Code Playgroud)
一个构造函数可以从另一个构造函数中调用。您只是忘记分配返回值。
*this = Foo::Foo();
Run Code Online (Sandbox Code Playgroud)
对于问题2,你需要委托构造函数。
Foo(int iX) : Foo() {
...
}
Run Code Online (Sandbox Code Playgroud)