我的代码:
#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.为什么?
答案 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