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

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

void MyFunc()

{

CFoo foo;//在堆栈(stack)中产生foo对象

}

第二种方法是在堆(heap)中产生它:

void MyFunc()

{

CFoo* pFoo=new CFoo();//在堆(heap)中产生对象

}

第三种方法是产生一个全局对象(同时也必然是个静态对象)

CFoo foo;//在任何函数范围外做此操作

第四种方法是产生一个局部静态对象

void CMyFunc()

{

static CFoo foo;//在函数范围之内的一个金泰对象

}

不论哪一种做法,C++都会产生一个针对CFoo构造函数的调用操作。

前两种情况,C++在配置内存之后,立刻产生一个隐藏的构造函数调用。

第三种情况,由于对象实现于任何"函数活动范围"之外,显然没有地方来安置这样一个构造函数调用操作。第三种情况的构造函数调用操作必须靠startup代码帮忙。startup是早于程序进入点(main或WinMain)执行起来的代码,由c++编译器提供,被链接到程序中。startup代码可能做些像函数库初始化、进程信息设立、I/O stream产生等操作,以及对static对象的初始化操作(也就是调用其构造函数)。当编译器编译你的程序,发现一个静态对象时,它会把这个对象加到一个链表中,并且还加上一个指针,指向对象的构造函数及其参数。把控制权交给程序进入点之前,starup代码会遍历链表,调用所有登记的构造函数和参数,这样就初始化了静态对象。

第四种情况(局部静态对象)只会有一个实例产生,而且在固定的内存上(既不是stack也是heap)。它的构造函数在控制权第一次转移到其声明处(也就是在MyFunc第一次被调用)时被调用。

C++四种不同的对象生存方式的更多相关文章

  1. spring mvc中几种获取request对象的方式

    在使用spring进行web开发的时候,优势会用到request对象,用来获取访问ip.请求头信息等 这里收集几种获取request对象的方式 方法一:在controller里面的加参数 public ...

  2. javascript一种新的对象创建方式-Object.create()

    1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不 ...

  3. 转: .NET MVC3 几种返回 JSON 对象的方式和注意事项

    .NET MVC3 几种返回 JSON 对象的方式和注意事项 转自:http://blog.csdn.net/xxj_jing/article/details/7382589 引言在用 .NET MV ...

  4. 四种常用的access连接方式

    整理出四种常用的access连接方式,当然,第1种这是最常用的(推荐使用).1. set dbconnection=Server.CreateOBJECT("ADODB.CONNECTION ...

  5. JavaScript中四种不同的属性检测方式比较

    JavaScript中四种不同的属性检测方式比较 1. 用in方法 var o = {x:1}; "x" in o; //true "y" in o; //fa ...

  6. jsp九大内置对象、四种作用域、跳转方式

    jsp有四种属性范围: page -> 页面级别,显然只有在一个页面内可用. request -> 请求级别 服务器跳转,一次请求之后消失. session -> 会话级别 客户端跳 ...

  7. ASP.NET Core 四种释放 IDisposable 对象的方法

    本文翻译自<Four ways to dispose IDisposables in ASP.NET Core>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! IDispos ...

  8. SpringBoot:四种读取properties文件的方式

    前言 在项目开发中经常会用到配置文件,配置文件的存在解决了很大一份重复的工作.今天就分享四种在Springboot中获取配置文件的方式. 注:前三种测试配置文件为springboot默认的applic ...

  9. java中四种引用类型(对象的强、软、弱和虚引用)

    对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2 ...

随机推荐

  1. TypeHandler的简单实例

    转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420149 TypeHandler是MyBatis config文件中可选的配置选项,其可以对实体属性 ...

  2. 三星galaxy s4问题解决及快捷操作

    http://blog.csdn.net/pipisorry/article/details/38474827 三星galaxy s4更改锁屏方式时出现故障 屏幕锁定设置除password以外,其它锁 ...

  3. How to Copy and Paste in the Ubuntu Gnome Terminal

    How to Copy: Select the content in terminal use your mouse , and then use Ctrl + Shift + C to copy t ...

  4. 了解javascript中的this --实例篇

    对javascript this的赋值有了深一层的理解后,看一下比较复杂的情况,this的应用篇参考<对javascript this的理解>. #demo1 var name=" ...

  5. 用iDSDT制作声显卡DSDT

    已有 2299 次阅读2011-10-24 21:00 |个人分类:Mac| DSDT 快速增加积分秘笈! windows下!--------------------------------第一步.下 ...

  6. Golang学习 - unicode/utf16 包

    ------------------------------------------------------------ // IsSurrogate 判断 r 是否为代理区字符 // 两个代理区字符 ...

  7. 嵌入式设备上运行AllJoyn注意事项

    1. 交叉编译AllJoyn库.编译成功后的文件位于:alljoyn-3.3.0-src\build\linux\arm\debug\dist\目录下: 2. 程序要使用AllJoyn,必须要启动al ...

  8. URL请求过程

    一.URL(Uniform Resource Locator)统一资源定位符,是可以从互联网上得到的资源的位置和访问方法的一种简洁表示,是互联网上标准资源的地址.互联网上的每一个文件都有一个唯一的UR ...

  9. TCP/IP协议原理与应用笔记22:静态和动态路由选择

    1. 静态路由选择: Static routing 管理员手工设置 管理员手动更新 不能保证路由的一致性和及时性 管理性强 没有路由开销 小型.变化缓慢网络 2. 动态路由选择 Dynamic rou ...

  10. JS实现滚动条滚到页面距离底部300px时执行事件的方法

    scrollTop为滚动条在Y轴上的滚动距离. clientHeight为内容可视区域的高度. scrollHeight为内容可视区域的高度加上溢出(滚动)的距离 $(window).scroll(f ...