![]() ![]() |
|
MoreEffectiveC++:避免缺省构造函数 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/3/19 9:30:30 文章录入:杜斌 责任编辑:杜斌 | |
|
|
但不是所有的对象都属于上述类型,对于很多对象来说,不利用外部数据进行完全的初始化是不合理的。比如一个没有输入姓名的地址簿对象,就没有任何意义。在一些公司里,所有的设备都必须标有一个公司ID号码,所以在建立对象以模型化一个设备时,不提供一个合适的ID号码,所建立的对象就根本没有意义。 在一个完美的世界里,无需任何数据即可建立对象的类可以包含缺省构造函数,而需要数据来建立对象的类则不能包含缺省构造函数。唉!可是我们的现实世界不是完美的,所以我们必须考虑更多的因素。特别是如果一个类没有缺省构造函数,就会存在一些使用上的限制。 请考虑一下有这样一个类,它表示公司的设备,这个类包含一个公司的ID代码,这个ID代码被强制做为构造函数的参数: class EquipmentPiece { public: EquipmentPiece(int IDNumber); ... }; 因为EquipmentPiece类没有一个缺省构造函数,所以在三种情况下使用它,就会遇到问题。第一中情况是建立数组时。一般来说,没有一种办法能在建立对象数组时给构造函数传递参数。所以在通常情况下,不可能建立EquipmentPiece对象数组: EquipmentPiece bestPieces[10]; // 错误!没有正确调用 // EquipmentPiece 构造函数 EquipmentPiece *bestPieces = new EquipmentPiece[10]; // 错误!与上面的问题一样 不过还是有三种方法能回避开这个限制。对于使用非堆数组(non-heap arrays)(即不在堆中给数组分配内存。译者注)的一种解决方法是在数组定义时提供必要的参数: int ID1, ID2, ID3, ..., ID10; // 存储设备ID号的 // 变量 ... EquipmentPiece bestPieces[] = { // 正确, 提供了构造 EquipmentPiece(ID1), // 函数的参数 EquipmentPiece(ID2), EquipmentPiece(ID3), ..., EquipmentPiece(ID10) }; 不过很遗憾,这种方法不能用在堆数组(heap arrays)的定义上。一个更通用的解决方法是利用指针数组来代替一个对象数组: typedef EquipmentPiece* PEP; // PEP 指针指向 //一个EquipmentPiece对象 PEP bestPieces[10]; // 正确, 没有调用构造函数 PEP *bestPieces = new PEP[10]; // 也正确 |
|
![]() ![]() |