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

标签 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 方法按预期工作。 Foo::iX 在该函数范围内和范围外都等于 2

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

所以我的问题有两个:

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

最佳答案

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);
    // ...
}; 

关于c++ - 如何从另一个构造函数调用 C++ 类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39199023/

相关文章:

c++ - 如何取消初始化 C++ 中的对象?

c++ 在低内存系统上。标准库正在使用所有内存!

c# - c#中非静态字段的对象引用

C++ dll堆内存分配问题

swift - 在基于 swift 的应用程序中与枚举成员交互

vue.js - 无法将事件绑定(bind)到对象方法

c++ - 更新对象的属性时遇到问题?

c++ - 出现奇怪的 "expected primary-expression"错误

c++ - 使用枚举指定的函数填充 vector

c++ - 我有多个通过 StackView 推送的 qml 文件。我如何将它们连接到 C++