如何从另一个构造函数调用一个c++类的构造函数



我试图在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倍的:

  1. 为什么c++的行为是这样的(一个构造函数不能从另一个构造函数中调用没有被分配的值)?
  2. 如何创建多个构造函数签名,但没有多余的重复代码做同样的事情?

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() {
    ...
}

最新更新