C++四种不同的对象生存方式
在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++四种不同的对象生存方式的更多相关文章
- spring mvc中几种获取request对象的方式
在使用spring进行web开发的时候,优势会用到request对象,用来获取访问ip.请求头信息等 这里收集几种获取request对象的方式 方法一:在controller里面的加参数 public ...
- javascript一种新的对象创建方式-Object.create()
1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不 ...
- 转: .NET MVC3 几种返回 JSON 对象的方式和注意事项
.NET MVC3 几种返回 JSON 对象的方式和注意事项 转自:http://blog.csdn.net/xxj_jing/article/details/7382589 引言在用 .NET MV ...
- 四种常用的access连接方式
整理出四种常用的access连接方式,当然,第1种这是最常用的(推荐使用).1. set dbconnection=Server.CreateOBJECT("ADODB.CONNECTION ...
- JavaScript中四种不同的属性检测方式比较
JavaScript中四种不同的属性检测方式比较 1. 用in方法 var o = {x:1}; "x" in o; //true "y" in o; //fa ...
- jsp九大内置对象、四种作用域、跳转方式
jsp有四种属性范围: page -> 页面级别,显然只有在一个页面内可用. request -> 请求级别 服务器跳转,一次请求之后消失. session -> 会话级别 客户端跳 ...
- ASP.NET Core 四种释放 IDisposable 对象的方法
本文翻译自<Four ways to dispose IDisposables in ASP.NET Core>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! IDispos ...
- SpringBoot:四种读取properties文件的方式
前言 在项目开发中经常会用到配置文件,配置文件的存在解决了很大一份重复的工作.今天就分享四种在Springboot中获取配置文件的方式. 注:前三种测试配置文件为springboot默认的applic ...
- java中四种引用类型(对象的强、软、弱和虚引用)
对象的强.软.弱和虚引用在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2 ...
随机推荐
- 利用<JavascriptSerializer类> 进行Json对象的序列化和反序列化
1. 首先, JavascriptSerializer类所在名空间: using System.Web.Script.Serialization; 2. 相关的3篇文章, 标记下: 使用JavaScr ...
- 从零开始学JAVA(06)-WebService_Jersey_Restful
由于项目上需要写一个简单的评价系统,像银行MM前面的那种非常满意.满意.不满意那种,结合一个安卓的APP一起使用.由于使用3G网页通讯,个人认为http这种方式更合适.曾经听在Delphi鸟窝群的白雪 ...
- Border绘制虚线框(转)
<Grid> <Border HorizontalAlignment="Center" VerticalAlignment="Center" ...
- linux环境中 对tomcat配置java环境
JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx2048m -XX:MaxPermSize=512m" JAVA_HOME="/weblogic1 ...
- JavaScript组成
JavaScript由ECMAScript,Dom,Bom三部分组成. ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufa ...
- 使用block来解决实现switch解决字符串
NSString *lookup=@"Hearts"; typedef void (^CaseBlock)(); NSDictionary *diction=@{@"D ...
- tcpdump常用命令
1. 只抓syn包 tcpdump -i eth1 'tcp[tcpflags] = tcp-syn' 2. 只抓ack包 tcpdump -nni xgbe1 dst host 191.168.10 ...
- 整理的Unity导出安卓工程利用ANT进行多渠道批量打包APK
Unity导出的安卓工程利用ant进行多渠道循环批量打包 一:设置JAVA环境变量 做android开发的配置这个是基础. win7 下配置java环境变量,下面是链接 http://www.cnbl ...
- linux 命令行发送邮件及附件
环境 本机安装sendmail了, 但是没有启动. 其他机器上有mail server, 并且已经把本机加到open relay列表中了, 可以通过该mail server发送邮件.做法如下:1. 安 ...
- javaweb学习总结二十五(response对象的用法一)
一:Reponse对象的概念 当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象. response对象包括三个部分:响应头.响应状态码以及响应体 二:r ...