C++ 的new 运算子和C 的malloc 函数都是为了配置内存,但前者比之后者的优点
是,new 不但配置对象所需的内存空间时,同时会引发构造式的执行。

所谓构造式(constructor),就是对象诞生后第一个执行(并且是自动执行)的函数,它
的函数名称必定要与类别名称相同。

相对于构造式,自然就有个析构式(destructor),也就是在对象行将毁灭但未毁灭之前
一刻,最后执行(并且是自动执行)的函数,它的函数名称必定要与类别名称相同,再
在最前面加一个~ 符号。

  1. #include <iostream>
  2. using namespace std;
  3. class CDemo{
  4. char name[20];
  5. public:
  6. CDemo(){
  7. cout<<"class begin !!!"<<endl;
  8. }
  9. CDemo(char * ch)
  10. {
  11. strcpy(name,ch);
  12. cout << "Constructor called for " << name << '/n';
  13. }
  14. ~CDemo(){
  15. cout<<"desturctor called for "<<name<<endl;
  16. }
  17. };
  18. void func()
  19. {
  20. CDemo LocalObjectInFunc("LocalObjectInFunc"); // in stack
  21. static CDemo StaticObject("StaticObject"); // local static
  22. CDemo* pHeapObjectInFunc = new CDemo("HeapObjectInFunc"); // in heap
  23. cout << "Inside func" << endl;
  24. }
  25. CDemo GlobalObject("GlobalObject"); // global static
  26. int main()
  27. {
  28. CDemo LocalObjectInMain("LocalObjectInMain"); // in stack
  29. CDemo* pHeapObjectInMain = new CDemo("HeapObjectInMain"); // in heap
  30. cout << "In main, before calling func/n";
  31. func();
  32. cout << "In main, after calling func/n";
  33. system("pause");
  34. }

以上代码的执行结果是:

Constructor called for GlobalObject
Constructor called for LocalObjectInMain
Constructor called for HeapObjectInMain
In main, before calling func
Constructor called for LocalObjectInFunc
Constructor called for StaticObject
Constructor called for HeapObjectInFunc
Inside func
desturctor called for LocalObjectInFunc
In main, after calling func
请按任意键继续. . .

所以可以得到以下几个结论:

  • 对于全域对象(如本例之GlobalObject),程序一开始,其构造式就先被执行
    (比程序进入点更早);程序即将结束前其析构式被执行。MFC 程序就有这
    样一个全域对象,通常以application object 称呼。
  • 对于区域对象,当对象诞生时,其构造式被执行;当程序流程将离开该对象的
    存活范围(以至于对象将毁灭),其析构式被执行。
  • 对于静态(static)对象,当对象诞生时其构造式被执行;当程序将结束时(此
    对象因而将遭致毁灭)其析构式才被执行,但比全域对象的析构式早一步执
    行。
  • 对于以new 方式产生出来的区域对象,当对象诞生时其构造式被执行。析构
    式则在对象被delete 时执行(上例程序未示范)。

四种不同的对象生存方式(in stack、in heap、global、local static)

在C++ 中,有四种方法可以产生一个对象。

第一种方法是在堆栈(stack)之中产生它:

void MyFunc()
   {
           CFoo foo; // 在堆栈(stack)中产生foo 对象
           ...
    }
第二种方法是在堆积(heap)之中产生它:

void MyFunc()
  {
       ...
      CFoo* pFoo = new CFoo(); // 在堆(heap)中产生对象
   }
第三种方法是产生一个全域对象(同时也必然是个静态对象):
        CFoo foo; // 在任何函数范围之外做此动作

第四种方法是产生一个区域静态对象:
   void MyFunc()
  {
       static CFoo foo; // 在函数范围(scope)之内的一个静态对象
       ...
  }

不论任何一种作法,C++ 都会产生一个针对CFoo 构造式的调用动作。前两种情况,C++
在配置内存-- 来自堆栈(stack)或堆积(heap)-- 之后立刻产生一个隐藏的(你的原
代码中看不出来的)构造式调用。第三种情况,由于对象实现于任何「函数活动范围
(function scope)」之外,显然没有地方来安置这样一个构造式调用动作。

是的,第三种情况(静态全域对象)的构造式调用动作必须靠startup 码帮忙。startup 码
是什么?是更早于程序进入点(main 或WinMain)执行起来的码,由C++ 编译器提供,
被联结到你的程序中。startup 码可能做些像函数库初始化、进程信息设立、I/O stream 产
生等等动作,以及对static 对象的初始化动作(也就是调用其构造式)。

当编译器编译你的程序,发现一个静态对象,它会把这个对象加到一个串行之中。更精

确地说则是,编译器不只是加上此静态对象,它还加上一个指针,指向对象之构造式及
其参数(如果有的话)。把控制权交给程序进入点(main 或WinMain)之前,startup 码
会快速在该串行上移动,调用所有登记有案的构造式并使用登记有案的参数,于是就初始化了你的静态对象。

第四种情况(区域静态对象)相当类似C 语言中的静态区域变量,只会有一个实体
(instance)产生,而且在固定的内存上(既不是stack 也不是heap)。它的构造式在
控制权第一次移转到其声明处(也就是在MyFunc 第一次被调用)时被调用。

c++对象的生命周期相关推荐

  1. Java 对象的生命周期

    Java对象的生命周期 在Java中,对象的生命周期包括以下几个阶段: 创建阶段(Created) 应用阶段(In Use) 不可见阶段(Invisible) 不可达阶段(Unreachable) 收 ...

  2. Hibernate学习(4)- Hibernate对象的生命周期

    1.Hibernate对象的生命周期(瞬时状态.持久化状态.游离状态) 1.瞬时状态(Transient): 使用new操作符初始化的对象就是瞬时状态,没有跟任何数据库数据相关联: 2.持久化状态(P ...

  3. C++对象模型9——临时对象的生命周期、模板及实例化分析、内联函数

    一.临时对象的生命周期 T c=a+b 假设T是一个类型,那么上述代码执行时,首先会产生一个临时对象用来存放a+b的结果(拷贝初始化临时对象),然后用该临时对象拷贝初始化c,最后临时对象被释放.如果开 ...

  4. Java对象的生命周期与作用域的讨论(转)

    导读: Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 + T2 +T3.其中T1表示对象的创建时间,T2表示对 ...

  5. java 对象 jvm生命_JVM对象的生命周期

    一旦一个类被装载.连接和初始化,它就随时可以被使用.程序可以访问它的静态字段,调用它的静态方法,或者创建它的实例.作为Java程序员有必要了解Java对象的生命周期. 类实例化 在Java程序中,类可 ...

  6. 把对象的创建交给spring来管理——  1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期

    把对象的创建交给spring来管理 spring对bean的管理细节     1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期 创建Bean的三种方式 ...

  7. java对象的生命周期及回收

    在网上看到一篇不错的文章,记录下来备忘. 要理解java对象的生命周期,我们需要要明白两个问题, 1.java是怎么分配内存的 ,2.java是怎么回收内存的. 喜欢java的人,往往因为它的内存自动 ...

  8. MyBatis 实际使用案例-核心对象的生命周期

    在编程式使用的这个demo 里面,我们看到了MyBatis 里面的几个核心对象:SqlSessionFactoryBuiler.SqlSessionFactory.SqlSession 和Mapper ...

  9. [原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定...

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  10. 面试:对象的生命周期

    面试:对象的生命周期 一旦一个类被装载.连接和初始化,它就随时可以被使用.程序可以访问它的静态字段,调用它的静态方法,或者创建它的实例.作为Java程序员有必要了解Java对象的生命周期. 类实例化 ...

最新文章

  1. fwm环境APP菜品数据加载失败的优化操作
  2. 又一个高等级数据中心着火了!
  3. 倩女手游服务器维护,倩女手游7月28日服务器在线维护公告
  4. python类基础知识注意点
  5. 数据结构:线性数据结构(2)-队列(栈,队列,deques, 列表)
  6. linux 虚函数调用性能,C++对象布局及多态实现探索之虚函数调用
  7. mysql关闭12260端口_windows 如何查看端口占用情况?
  8. HTML5基础与Meta http-equiv属性详解
  9. 第二次作业:微信实例分析
  10. hdmi网线延长器_HDMI单网线延长器HE200使用教程
  11. SQL Server基础操作(此随笔仅作为本人学习进度记录十 !--触发器)
  12. element-ui table头部标题列栏合并
  13. 职场拓展人脉的老派艺术
  14. Stduino学习(二十四)敲击传感器模块
  15. javascript世界上最被误解的语言
  16. 一键获取LOL英雄联盟所有英雄技能图片
  17. VMware Workstation Player 找不到共享文件夹的解决方法
  18. 大型会议的礼仪(2)
  19. VR全景乡村,VR全景,身临其境,感受自然
  20. python随机批量爬qu短视频——学习中

热门文章

  1. SSI指令使用详解(转)
  2. 开发管理 -启动项目(转)
  3. 是时候了,我们需要前端架构师
  4. OSPF特殊区域的作用
  5. Debian - NFS搭建 + 测试
  6. 基于Cocos2d-x开发guardCarrot--6 《保卫萝卜2》解锁天天向上玩法
  7. Security+ 学习笔记24 数据中心防护
  8. MPLS VXN配置实例——RT值的妙用
  9. PyCharm 2020.2.3复制粘贴及删除键修正
  10. 在metasploitable里面搭建ZVulDrill