【问题标题】:How to call a C++ class Constructor from another Constructor [duplicate]如何从另一个构造函数调用 C++ 类构造函数 [重复]
【发布时间】:2017-01-05 01:23:45
【问题描述】:

我正在尝试在 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. 如何创建多个构造函数签名,但又没有多余的重复代码做同样的事情?

【问题讨论】:

  • 了解委托构造函数。还阅读了成员初始化。例如here.

标签: c++ object methods constructor overloading


【解决方案1】:

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

您可以像这样使用delegating constructor(C++11 起):

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

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

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

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

【讨论】:

  • @songyuanyaho : 你如何定义临时的?在一般意义上或更技术意义上?请解释。谢谢。
  • @WoodMath 在更技术意义上。默认构造函数被显式调用以创建一个临时对象,该对象立即被丢弃。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    *this = Foo::Foo();
    

    对于问题2,您需要delegating constructors

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

    【讨论】:

    • *this = Foo:Foo() 仅在分配可以处理部分构造的对象时才有效。 (所有成员和基都将被正确构造,但构造函数尚未完成,因此对象本身的生命周期尚未开始。)
    猜你喜欢
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 2014-03-12
    • 1970-01-01
    相关资源
    最近更新 更多