非必要不提供default constructor

所谓 default constructor (也就是说不给任何自变量就可调用者)是C++一种“无中生有”的方式。constructors用来将对象初始化,所以default constructors的意思是在没有任何外来信息的情况将对象初始化。

如果一个类缺乏一个default constructor, 当你使用这个class 时便会有某些限制。
例:
针对公司仪器而设计的class,在其中,仪器识别码是一定得有的一个constructor自变量。
class EquimentPiece
{
public:
EquimentPiece( int IDNumber);
.....
};
由于缺乏default constructor,其运行可能在3种情况下出现问题。
1、在产生数组的时候,一般而言没有任何方法可以为数组中的对象指定constructor自变量。
EquimentPiece bestPieces[10];//无法调用EquimentPiece ctors.
EquimentPiece *bestPieces = new EquimentPice[10].//错误,另有一些问题
有3种方法可以解决这个问题
(1) int ID1,ID2,,,,ID10;
EquimentPices bestPieces[] = { EquimentPiece(ID1),
EquimentPiece(ID2),       
EquimentPiece(ID3),
.......
EquimentPiece(ID10)
(2)使用指针数组而非对象数组
typedef EquimentPiece* PEP;
PEP bestPieces[10];//这里不需要调用ctor
PEP *bestPieces[10] = new PEP[10];
数组中的各指针可用来指向一个个不同的EquimentPiece object。
for( int i=0; i < 10; ++i)
bestPieces[i] = new EquimentPiece( ID Number);
此方法的缺点有二:i、必须显示地删除数组所指向的对象;ii、需要的内存总量比较大,存指针,存对象。

内存的问题可以通过如下的方式解决:
先为此数组分配raw memory,然后使用placement new 在这块内存上构造EquimentPiece objects。
void* rawmemory = operator new[](10*sizeof(EquimentPiece));
EquimentPiece* bestPiece = static_cast<EquimentPiece*>(rawMemory);
for( int i=0; i < 10; ++i)
new (&bestPieces[i]) EquimentPiece(ID Number);
.....
//析构
for ( int i=9; i>=0; --i)
bestPiece[i].~EquimentPiece();
//释放raw memory
operator delete[] (rawMemory);

然而添加无意义的default constructor,也会影响classes的效率。在此情况下,我们需要测试字段是否真初始化了,其调用者必须为测试行为付出代价。
并为测试代码付出空间代价,因为可执行文件和程序库都变大了。万一测试结果为否定,对应的处理程序又需要一些空间代价。如果default constructor
可以确保对象的所有字段都会被正确地初始化,上述所有成本都可以免除。如果default constructor无法提供这种保证,那么最好避免default constructor的
出现。虽然这可能会对class的使用带来某种限制,但同时也带来某种保证:当你真的使用了这样的class,你可以预期它们所产生的对象被完全地初始化,实现上亦会
富有效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值