4 非必要不提供default constructor

本文探讨了C++中缺乏默认构造函数的类在数组创建、模板容器使用及虚基类中的局限性,并提出了一种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考虑下面的针对公司仪器设计的class,仪器识别码是一定的有的一个constructor自变量:
class EquipmentPiece
{
public:
EquipmentPiece(int IDNumber);
...
};

1.第一种情况,在产生数组的时候,一般而言没有任何方法可以为数组中的对象指定constructor自变量。所以几乎不可能产生一个由EquipmentPiece objects构成的数组:
EquipmentPiece bestPieces[10];					//错误
EquipmentPiece* bestPieces = new   EquipmentPiece[10];		//错误
2.class如果缺乏default constructor 带来的第二个缺点是:它们将不适合于许多templateed-based container classes。对于那些templates而言,被实例化的”目标类型“必须的有一个default constructors。

例如一个Array class而写的template可能看起来像这样:
template<class T>
class Array
{
public:
	Array(int size);
	...
private:
	T* data;
};
			
template<class T>
Array<T>::Array(int size)
{
	data = new T[size];  //数组中每个元素调用T::T();
	...
}	

3.最后一中情况下是virtual base classes有关,virtual base classes如果缺乏default constructor,与之合作将是一种惩罚。

由于“缺乏 default constructor”带来的诸多束缚,有些人便认为所有的class都应该提供default constructor 甚至即使其default constructor没有足够信息将对象完整的初始化。如下:
class EquipmentPiece
{
public:
	EquipmentPiece(int IDNumber = UNSPECIFIED);
	...
private:
		static const int UNSPECIFIED;
};	

这就允许EquipmentPiece objects被这样生产出来:
EquipmentPiece  e;		//现在这样可行。

这几乎总是造成class内的其他member functions变得复杂,因为这便不再保证一个EquipmentPiece object的所有字段都有意义的初值。大部分的member functions便必须检查ID是否存在,否则就会出问题。

添加无意义的default constructor,也会影响效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值