执行期
对象的析构
如果一个区段(“{}”括起来的区域)或函数内有一个以上的离开点,析构函数必须放在每一个离开点。
{
Point point;
swtich(int(point.x)){
case -1:
//destructor
return;
case 0:
//destructor
return;
case 1:
//destructor
return;
default:
//destructor
return;
}
//destructor
}
全局对象
C++程序的所有的全局对象都放置在程序的数据段中,如果显式给定一个值,那么该全局对象将该值作为初值,否则对象内存内容为0。
对象数组
Point knots[10];
上述语句中,如果Point
没有默认构造函数,那么我们只要配置足够的内存即可。如果存在默认构造函数,那么该构造函数必须轮流施加在每一个元素上。
对于较新的编译器,提供两个函数应对含有virtual
的类和没有virtual
的类来处理类数组的初始化。
Point knots[10]={Point(),Point(1,1,1)};
上面的初始化会被转成下面这种形式
Point knots[10];
Point::Point(&knots[0]);
Point::Point(&knots[1],1,1,1);
vec_new(&knots+2,sizeof Point,8,&Point::Point,0);
new和delete
运算符new实际上由两个步骤完成
- 通过适当的new运算符函数配置所需的内存。
- 将配置的对象设立初值。
delete运算符C++会要求被删除的指针不是空指针。
delete pi;
//为↓
//if(pi!=nullptr)
// _delete(pi);
注意delete只是释放指针指向的空间,并不删除指针本身,所以即便delete了指针,对他使用取值运算依旧是合法的,但是会造成不确定行为。
一般而言,定位new不支持多态。而且,在调用delete的时候,delete运算会把提前分配的空间也一起回收,为了只让程序在分配的空间中只回收对象,我们需要显式调用析构函数而非使用delete运算符。