8.10.2 使用new和delete为对象数组分配/释放动态空间
使用new为对象数组分配动态空间时,不能显式调用对象的构造函数,因此,对象要么没有定义任何形式的构造函数(由编译器默认提供),要么显式定义了一个(且只能由一个)所有参数都有默认值的构造函数(包括无参构造函数)。代码8.23演示了如何为动态对象数组申请内存空间。
代码8.23 对象数组动态空间管理NewforObjectArray
<———————————————文件名:point.h———————————————-> 01 #include<iostream> 02 using namespace std; 03 class point 04 { 05 private://private数据成员列表 06 int x; 07 int y; 08 public: 09 point(int xp=0,int yp=0)//构造函数,带默认参数值 10 { 11 x=xp; 12 y=yp; 13 cout<<"构造函数被调用"<<endl; 14 } 15 ~point()//析构函数 16 { 17 cout<<"析构函数被调用"<<endl; 18 } 19 void print()//成员函数,类内部实现 20 { 21 cout<<"x:"<<x<<",y:"<<y<<endl; 22 } 23 void Set(int xp,int yp)//成员函数,类内部实现,用来修改成员x和y 24 { 25 x=xp; 26 y=yp; 27 } 28 }; <———————————————文件名:example823.cpp————————————> 29 #include"point.h" 30 using namespace std; 31 int main() 32 { 33 //申请一块动态内存,连续存放连个point对象,将首地址赋值给point指针p 34 point*p=new point[2]; 35 p[0]. print();//可以将指针当成数组名,使用下标运算符访问对应对象,等价性 36 p[1]. Set(4,5);//调用数据元素(对象)的成员函数Set 37 p[1]. print(); 38 delete[]p;//释放申请的动态内存 39 p=NULL;//养成良好习惯,防止野指针 40 return 0; 41 }
输出结果如下所示。
构造函数被调用 构造函数被调用 x:0,y:0 x:4,y:5 析构函数被调用 析构函数被调用
【代码解析】代码第34行,开辟了一大小为2的对象数组,point类中定义的所有参数都有默认值的构造函数被调用,根据指针和数组名的等价性,通过诸如p[0]和p[1]的形式对数组中的对象进行访问。“delete[]p;”释放了数组所占的内存空间,new和delete激活了数组中每个对象的构造函数和析构函数。
注意
用数组名的形式(如p[0]、p[1])对其中的对象访问,如果使用“p->print();”“p++;”等指针形式,一旦p的值不同于内存申请时返回的指针,delete的操作会引发错误。