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的声明结束,或直到临时对象的声明范畴结束------视哪一种情况先到达而定。