深入c++对象模型之执行期语意学

1.对象的构造与解构

  一般而言,constructor 和 destructor的安插都会如你所预期:

      //c++伪码

    {

      Point point;

      //point.Point::Point();一般而言会被安插在这里

     ...

     //point.Point::~Point();一般而言会被安插在这里 

    }

    注意:一般而言我们会将对象放置在使用它的程序附近,这样做可以节省不必要的对象产生操作和摧毁操作。

   1>全局对象

c++保证全局对象,一定会在main()函数中第一次用到前,把其构造出来,在main()函数结束前把其摧毁掉。

下图表示的是cfront的munch构造全局对象的过程(摘自《深入探索c++对象模型》):


    2>局部静态对象

只有在构造函数被调用时才初始化静态局部对象。

   3>对象数组

如果没有constructor也没有destructor,那我们只需足够的内存存储n个连续的对象元素。

    4>default constructor和数组

cfront采用的方法是产生一个内部的stub constructor ,没有参数。在其函数内调用由程序员提供的constructor,并将default 参数明确指定过去。

2.new和delete操作

1>new

int  *pi = new int[5];

由两步构成:

  (1)通过适当的new运算符函数实体,配置所需的内存:

                //调用函数库中的new运算符

               int *pi = _new( sizeof(int));

   (2)给配置得来的对象设立初值:

              *pi = 5;

更进一步的说,初始化操作要在内存配置成功之后再执行。

2>delete

    只有在中括号出现时,编译器才寻找数组的维度,否则它便假设只有单独一个object要被删除。如果程序员没有提供必要的中括号,那么就只有第一个元素被解构,其他的元素仍然存在,虽然相关的内存已经被要求归还。

注意:程序员要避免以一个base class指针指向一个derived class objects所组成的数组。(因为base class object 的一般比derived小,在解构的时候会被错误的执行,因而不能解构全部内存)。

3.临时对象

1>在某些情况下,由processor产生临时性对象是有必要的,亦或是比较方便的。这样的临时对象由编译器来定义。

2>临时性对象被摧毁,应该是对完整表达式求值过程中的最后一个步骤。该完整表达式造成临时对象的产生

3>凡含有表达式执行结果的临时性对象,应该存留到object的初始化操作完成为止。

4>如果一个临时性对象被绑定于一个reference。对象将残留,知道被初始化之reference的声明结束,或直到临时对象的声明范畴结束------视哪一种情况先到达而定。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值