博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中构造函数和析构函数的执行顺序
阅读量:4223 次
发布时间:2019-05-26

本文共 1058 字,大约阅读时间需要 3 分钟。

构造函数顺序为:

  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的话,没有最后的一句输出。

转载地址:http://iazqi.baihongyu.com/

你可能感兴趣的文章
cocos2dx menu位置计算
查看>>
cocos2dx资源加载机制(同步/异步)
查看>>
cocos2dx C++调用java -- 字符串传递
查看>>
git学习网站
查看>>
JavaScript 学习网站
查看>>
cocos2dx java调用c++ -- 字符串传递
查看>>
CCScaleTo与CCScaleBy比较
查看>>
cocos2dx CCObject引用计数,内存释放分析(1)
查看>>
cocos2dx2.X 编译时,传递编译选项
查看>>
ccCArray.cpp 文件
查看>>
cocos2dx 屏幕大小
查看>>
libgdx: 2D Particle Editor工具使用
查看>>
eclipse 给jar库添加源码
查看>>
C++ 枚举声明 enum 和 enum class
查看>>
Python optionParser模块的使用方法
查看>>
android 消灭星星出错
查看>>
PyCharm 教程(三)Hello world!
查看>>
PyCharm: 显示源码行号
查看>>
cocos2dx使用第三方字库.ttf,需要注意的事项
查看>>
cocos2.X版本lua端使用定时器的方法
查看>>