时间:2014.03.08
地点:基地二楼
------------------------------------------------------------------------
一、简述
C++中的默认构造函数使得在类的对象生成时无需提供任何基本信息也能初始化对象。比如数值类的对象一般初始化为0,指针类对象初始化为null等。但还有些情况,有些对象如果没有额外信息无法完成初始化动作,比如你手机里的电话簿字段的类,如果没有获得外界指定的人名产生的对象将会毫无意义。再比如公司生产的仪器设备每台都有一个识别编号,为这种用途(模拟仪器设备)产生的对象如果不提供适当的ID号码也是毫无意义的。因此,在现实世界里,可以合理从无到有生成对象的类应该含有默认构造,而必须有某些外来信息才能生成对象的类不必拥有默认构造。但当一个类缺乏默认构造时使用起来又会有某些限制,这是后面会详细讨论的内容。
------------------------------------------------------------------------
二、问题
考虑一个为公司仪器设计的类,仪器编号是每台仪器的必要属性。于是这个类定义如下:
class EquipmentPiece{ public: EquipmentPiece(int id_number); ...... };这样EquipmentPiece就没有默认构造函数了,于是问题也就有了。
在一个设备系列中,比如产生一个数组,于是在这里很不方便为数组中对象指定ID号。所以几乎不可能产生一个由EquipmentPiece对象构成的数组。比如:
EquipmentPiece best_pieces[10]; //错误,因为类无默认构造函数,无法调用 EquipmentPiece *best_pieces_ptr=new EquipmentPiece[10]; //错误
------------------------------------------------------------------------
三、解决问题
1.使用非堆数组,在定义数组时提供必要的自变量信息:这样做的缺点一是要记得删除数组所指的所有对象,否则会造成资源泄露。二是内存总量变大,因为你需要空间放置指针还需要空间放置EquipmentPiece对象。
int ID1,ID2,ID3,......ID10; ... EquipmentPiece best_pieces[]={ EquipmentPiece(ID10, EquipmentPiece(ID2), EquipmentPiece(ID3), EquipmentPiece(ID4), ...... EquipmentPiece(ID10) };缺点是无法扩展堆数组
2.使用指针数组而非对象数组
typedef EquipmentPiece* FEP; //PEP是指向EquipmentPiece的指针 PEP best_pieces[10]; //定义一个指针数组,无需调用ctor PEP *best_pieces=new PEP[10];// 也不错 现在,数组中各指针可用来指向不同的EquipmentPiece对象 for(int i==0;i<10;++i) best_pieces[i]=new EquipmentPiece(ID Number);