C++对象的4种生存方式

在C++中,有4种不同的方式来产生一个对象。现在我们有一个类叫做CMyClass,我们可以可以用如下4种不同方式来产生一个对象:

一、在栈(stack)中产生:

void MyFunc()
{
    ...
    CMyClass myobj;    //在栈中产生myobj对象
    ...
}

二,在堆(heap)中产生:

void MyFunc()
{
    ...
    CMyClass * myobj = new MyClass();    //在堆中产生
    ...
}

三、产生全局对象(也是静态对象):

...
 CMyClass myobj;    //在任何函数之外
...


四、产生一个局部静态对象:

void MyFunc()
{
    ...
    static CMyClass myobj;//在函数范围之内
    ...
}

说明:
不论那种方式,C++都会产生一个对CMyClass构造函数的调用操作。
前两种情况,在C++分配对象所需内存(第一种在栈中,第二种在堆中)之后会调用构造函数(隐蔽的,在代码中不能看出来)。

而第三种情况(静态全局对象)对构造函数的调用操作安放在什么地方呢?
由于对象实现于任何函数活动范围之外(还没有进入程序的入口点——main或WinMain),所以要依靠startup的帮助,startup的代码由C++编译器提供,被链接在程序中,是更早于程序入口点执行起来的代码。startup代码主要做些像函数库初始化、进程信息建立、I/Ostream产生等等操作,以及对static对象的初始化操作(也就是调用其构造函数)。当编译器编译程序的时候,发现一个静态对象时,它会把把这个对象加到一个链表中,更精确的说法是:编译器不只是加上此静态对象,还会加上一个指针,指向对象的构造函数及其参数(如果有参数),在把控制权交给程序入口点之前,startup代码会根据链表中的记录来调用所有登记的构造函数并使用登记在案的参数,于是就初始化了全局(静态)对象。

第四种情况(局部静态对象)类似C语言中的静态局部变量,只会有一个实例(instance)产生,而且在固定的内存上(既不在栈上也不在堆上),它的构造函数只会在控制权第一次转移到其声明处(即程序第一次走到"static CMyClass myobj; "处 )才会被调用。

参考:本文中提到的堆和栈,可以参看《Windows via C/C++》中的内存管理部分。

(申明:本文由forl发布于CSDN,作为自己学习探索过程中的笔记,有描述不当或错误指出,欢迎交流指正微笑

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值