今天在测试一个构造函数和析构函数的用例的时候,发现我们所钟爱的VC6.0实在是Bug问题越来越多,对于学习C++的新手来讲,有必要在这里给大家说明一下。
构造函数顺序为:
-
全局对象的构造函数;
-
main函数中对象的构造函数,包括automatic、static依次调用;
-
main中遇到函数中有局部对象时,进入到函数中调用局部对象的构造函数。
注:static对象的构造函数永远只调用一次。
析构函数顺序为:
-
退出函数时,执行函数内构造的automatic对象的析构函数,注:static对象不析构;
-
main函数中按构造的逆序析构automatic对象;
-
调用函数中定义的static对象的析构函数;
-
调用main中定义的static对象的析构函数;
-
最后调用全局对象的析构函数。
注:复合中的构造、析构顺序
构造:按声明对象的顺序来构造成员对象,而不是按照构造函数成员初始值列表中列出的顺序;而且在包含它们的类对象(宿主对象)被构造之前构造。即:由内向外构造。
析构:按对象构造的逆序析构。对于复合对象,先析构主对象,再析构其包含的对象。
比如有以下的测试用例:
//#i nclude <iostream.h>
#i nclude <iostream>
using namespace std;
class Demo {
int id;
public:
Demo(int i)
{ id = i;
cout << "id=" << id << ",Con" << endl; }
~Demo()
{ cout << "id=" << id << ",Des" <<endl; }
};
Demo d1(4);
void fun(Demo d) {
static Demo d2(2);
Demo d3(3);
cout << "fun" << endl;
}
void main () {
cout <<"main"<< endl;
fun(d1);
cout << "endmain" << endl;
fun(d1);
Demo * p = new Demo(8);
}
程序执行的时候,在VC6 withSp6下运行的结果
id=4,Con
main
id=2,Con
id=3,Con
fun
id=3,Des
id=4,Des
endmain
id=3,Con
fun
id=3,Des
id=4,Des
id=8,Con
id=2,Des
//id=4,Des //在用<iostream.h>的时候才有此句输出
其中包含有注释的部分,为调整包含的头文件为<iostream.h>的情况下才有的输出。如果使用 命名空间的std的话,没有最后的一句输出。
从百度上找了半天,才发现不是没有调用全局变量的析构函数,而是因为我们所用的编译器有问题,这是MS的产品对于C++的支持做的不是尽善尽美,有网友说在Vc7.0中好想消除了这个Bug。