C++让人崩溃系列--不要在构造函数中调用其他构造函数

先做个小测验,不要编译运行,请问下面的代码输出什么?

[cpp]
#include <string>
using std::string;

class Factory {
public:
Factory() {
Factory("scheduler.conf");
printf("Factory()\n");
}

Factory(const string &str) {
printf("Factory(string)\n");
}

~Factory() {
printf("Deconstruct\n");
}

};

int main()
{
Factory factory;
}
[/cpp]

 

答案公布:

[cpp]
Factory(string)
Deconstruct
Factory()
Deconstruct
[/cpp]

如果你问:怎么可能有两个析构!!那么我估计你是学过Java的,并且把Java和C++的构造、析构机制搞混了。

在Java中,构造函数的第一行调用其他构造函数是允许的,表示调用其他构造函数构造对象。
但是标准C++中(注意是ISO 99,VC忽略)这是不允许的,

[cpp]
Factory()
{
Factory("an other Constructer()");
}
[/cpp]

这种情况只是在Factory()中使用Factory(string)创建了一个临时Factory对象,当}之后,这个临时对象就消失了。

好了……我觉得我的C++好菜……这么一个问题搞了我3个小时……哎

Leave a Reply

Your email address will not be published. Required fields are marked *