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

时间:2016-08-29 05:28:02

标签: c++ object methods constructor overloading

我正在尝试用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方法按预期工作。 <{1}}等于该函数范围内外的Foo::iX

但是,当从2构造函数中调用Foo(void)构造函数时,Foo(int)仅在该构造函数中保持等于Foo::iX。一旦退出该方法,它就会恢复为1

所以我的问题是双重的:

  1. 为什么C ++会这样做(如果没有分配的值,则无法从另一个构造函数中调用构造函数?)
  2. 如何创建多个构造函数签名,但没有多余的重复代码执行相同的操作?

3 个答案:

答案 0 :(得分:10)

Foo::Foo();中的

Foo::Foo(int)未按预期调用当前对象的默认构造函数。它只构造一个临时的Foo,它与当前对象无关。

您可以使用delegating constructor(自C ++ 11开头):

Foo(int iX) : Foo() {
    // ...
}; 

请注意Foo::Foo()将在Foo::Foo(int)的正文之前调用。

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

Foo() {
    setX(1);
    // ...
};
Foo(int iX) {
    setX(iX);
    // ...
}; 

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

可以从另一个构造函数中调用构造函数。你只是忘了分配返回值。

*this = Foo::Foo();

对于问题2,您需要delegating constructors

Foo(int iX) : Foo() {
    ...
}