C++ 中构造函数与析构函数的执行顺序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangluomin/article/details/17538589
今天在测试一个构造函数和析构函数的用例的时候,发现我们所钟爱的VC6.0实在是Bug问题越来越多,对于学习C++的新手来讲,有必要在这里给大家说明一下。

构造函数顺序为:

  1.  全局对象的构造函数;
  2.  main函数中对象的构造函数,包括automatic、static依次调用;
  3.  main中遇到函数中有局部对象时,进入到函数中调用局部对象的构造函数。

     注:static对象的构造函数永远只调用一次。

析构函数顺序为:

  1. 退出函数时,执行函数内构造的automatic对象的析构函数,注:static对象不析构;
  2. main函数中按构造的逆序析构automatic对象;
  3. 调用函数中定义的static对象的析构函数;
  4. 调用main中定义的static对象的析构函数;
  5. 最后调用全局对象的析构函数。

注:复合中的构造、析构顺序

     构造:按声明对象的顺序来构造成员对象,而不是按照构造函数成员初始值列表中列出的顺序;而且在包含它们的类对象(宿主对象)被构造之前构造。即:由内向外构造。

    析构:按对象构造的逆序析构。对于复合对象,先析构主对象,再析构其包含的对象。

比如有以下的测试用例:
//#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。
展开阅读全文

没有更多推荐了,返回首页