构造函数不设置成员变量

时间:2012-05-25 20:04:58

标签: c++ class constructor

我的代码:

#include <iostream>
using namespace std;

class Foo
{
public:
    int bar;

    Foo()
    {
        bar = 1;
        cout << "Foo() called" << endl;
    }

    Foo(int b)
    {
        bar = 0;
        Foo();
        bar += b;
        cout << "Foo(int) called" << endl;
    }
};

int main()
{
    Foo foo(5);
    cout << "foo.bar is " << foo.bar << endl;
}

输出:

Foo() called
Foo(int) called
foo.bar is 5

为什么foo.bar值不是6?调用Foo()但未将bar设置为1.为什么?

4 个答案:

答案 0 :(得分:12)

在以下构造函数中,Foo()的行不会委托给前一个构造函数。相反,它会创建一个Foo类型的新临时对象,与*this无关。

Foo(int b)
{
    bar = 0;
    Foo(); // NOTE: new temporary instead of delegation
    bar += b;
    cout << "Foo(int) called" << endl;
}

构造函数委派的工作原理如下:

Foo(int b)
    : Foo()
{
    bar += b;
    cout << "Foo(int) called" << endl;
}

但是,这只适用于C ++ 11。

答案 1 :(得分:3)

你不能像普通函数一样使用构造函数。在你的代码中调用Foo()在堆栈中创建一个新对象。

答案 2 :(得分:2)

因为你在构造函数中有这一行:

bar = 0;

您正尝试在第二个构造函数中调用另一个带有Foo()调用的构造函数,但它只是创建一个临时Foo实例。

答案 3 :(得分:2)

你不应该从另一个构造函数中调用构造函数

Can I call a constructor from another constructor (do constructor chaining) in C++?

除非您正在运行C ++ 11