您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-19 10:11 218 查看
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的声明结束,或直到临时对象的声明范畴结束------视哪一种情况先到达而定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: