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

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

#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;
}

 

答案公布:

Factory(string)
Deconstruct
Factory()
Deconstruct

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

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

Factory()
{
   Factory("an other Constructer()");
}

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

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

Leave a Reply

Your email address will not be published.