如何从另一个构造函数调用 C++ 类构造函数 [重复]

Posted

技术标签:

【中文标题】如何从另一个构造函数调用 C++ 类构造函数 [重复]【英文标题】:How to call a C++ class Constructor from another Constructor [duplicate] 【发布时间】: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 倍的:

    为什么 C++ 会出现这种行为(在没有赋值的情况下,不能从另一个构造函数中调用构造函数)? 如何创建多个构造函数签名,但又没有多余的重复代码做同样的事情?

【问题讨论】:

了解委托构造函数。还阅读了成员初始化。例如here. 【参考方案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() 仅在分配可以处理部分构造的对象时才有效。 (所有成员和基都将被正确构造,但构造函数尚未完成,因此对象本身的生命周期尚未开始。)

以上是关于如何从另一个构造函数调用 C++ 类构造函数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中从另一个构造函数调用一个构造函数?

C ++:从另一个构造函数隐式调用构造函数

在java中从另一个调用一个构造函数[重复]

C++中如何在子类的构造函数中调用基类的构造函数来初始化基类成员变量

C++:对象和类|| 类的构造函数与析构函数

C++:对象和类|| 类的构造函数与析构函数