MoreEffectiveC++:避免缺省构造函数

MoreEffectiveC++:避免缺省构造函数,第1张

MoreEffectiveC++:避免缺省构造函数,第2张

默认构造函数(指不带参数的构造函数)是C++语言中无中生有的一种方式。构造函数可以初始化对象,而默认构造函数可以在创建对象时不使用任何外部数据来初始化对象。有时候这个方法是好的。比如一些行为特征与数字相似的对象初始化为空值或不确定值,以及链表、哈希表、图等数据结构都是合理的。也可以初始化为空容器。

但并不是所有的对象都属于上述类型,对于很多对象来说,不使用外部数据进行完全初始化是不合理的。例如,没有名称的地址簿对象是没有意义的。在某些公司中,所有设备都必须标有公司ID号,因此在创建对象以对设备建模时,不提供适当的ID号就创建对象是没有意义的。

在一个完美的世界中,不需要任何数据就可以构建对象的类可以包含默认构造函数,而需要数据来构建对象的类不能包含默认构造函数。唉!但我们的现实世界并不完美,必须考虑更多的因素。特别是,如果一个类没有默认的构造函数,它的使用会有一些限制。
请考虑有这么一类,代表公司的设备。这个类包含一个公司的ID代码,它被强制作为构造函数的一个参数:

类别设备件{
公共:
设备件(int id number);
...
};

因为EquipmentPiece类没有默认的构造函数,所以在三种情况下使用它时会遇到问题。第一种情况是创建数组时。一般来说,在构建对象数组时,没有办法将参数传递给构造函数。因此,在正常情况下,不可能构建一个设备物件数组:

设备件best pieces不幸的是,这种方法不能用于堆数组的定义。更通用的解决方案是使用指针数组而不是对象数组:;//错误!
// EquipmentPiece构造函数
equipment piece * best pieces =
new equipment piece[10]调用不正确;//错误!和上面的问题一样

但是仍然有三种方法可以绕过这个限制。对于非堆数组(也就是说,内存不会分配给堆中的数组)。一种解决方案是在定义数组时提供必要的参数:

int ID1,ID2,ID3,...,ID10//
//变量
...
equipment piece best pieces[]= {//正确,提供参数
equipment用于构造
EquipmentPiece(ID1),//函数。
设备件(ID3),
...,
equipment piece(ID10)
};

[10]

typedef设备件* PEP// PEP指针指向
//一个EquipmentPiece对象
PEP best pieces[10];//正确,没有调用构造函数
pep * best views = new pep[10];//也正确

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » MoreEffectiveC++:避免缺省构造函数

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情