关于对象:如何从另一个构造函数调用C ++类构造函数

How to call a C++ class Constructor from another Constructor

本问题已经有最佳答案,请猛点这里访问。

我试图在C++中创建一个需要多个对象构造函数的对象。比如说Foo()Foo(int),其中Foo(int)Foo()。简化代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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;
}

其输出为

1
2
3
4
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

所以我的问题是两方面的:

  • 为什么C++会这样做(构造函数不能在没有赋值的另一个构造函数中调用)?
  • 如何创建多个构造函数签名,但不需要重复的代码执行相同的操作?

  • Foo::Foo(int)中的Foo::Foo();没有如您预期的那样调用当前对象的默认构造函数。它只是构造一个临时的Foo,与当前对象无关。

    您可以使用委托构造函数(因为C++ 11)如下:

    1
    2
    3
    Foo(int iX) : Foo() {
        // ...
    };

    请注意,在这里,Foo::Foo(int)的主体之前将调用Foo::Foo()

    避免重复代码的另一种方法是使用setX()作为通用的初始化方法。(如果不合适,可以换一个新的。)

    1
    2
    3
    4
    5
    6
    7
    8
    Foo() {
        setX(1);
        // ...
    };
    Foo(int iX) {
        setX(iX);
        // ...
    };


    如果您能够使用C++ 11编译器,则可以使用委托构造函数。

    1
    2
    // Use Foo(int) to initialize the object when default constructor is used.
    Foo() : Foo(1) {}


    可以从另一个构造函数中调用构造函数。您只需忘记分配返回值。

    1
    *this = Foo::Foo();

    对于问题2,需要委托构造函数。

    1
    2
    3
    Foo(int iX) : Foo() {
        ...
    }