引子:
请考虑一下有这样一个类,它表示公司的设备,这个类包含一个公司的ID代码,这个ID代码被强制做为构造函数的参数(因为没有ID的设备是无意义的):
class EquipmentPiece {
public:
EquipmentPiece(int IDNumber);
...
};
先说明无意义的构造函数会带来一些限制
- 建立数组时,这两种方式都会调用默认构造函数,但并没有
EquipmentPiece bestPieces[10];
EquipmentPiece *bestPieces = new EquipmentPiece[10];
- 它们无法在许多基于模板(template-based)的容器类里使用
因为很多容易需要默认构造函数
- 不提供缺省构造函数的虚基类,很难与其进行合作
因为几乎所有的派生类在实例化时都必须给虚基类构造函数提供参数。
这就要求所有由没有缺省构造函数的虚基类继承下来的派生类(无论有多远)都必须知道并理解提供给虚基类构造函数的参数的含义。
派生类的作者是不会企盼和喜欢这种规定的。
但为什么作者建议避免无意义的缺省构造函数呢?
如此这般定义,即可以保证成员函数不需要做无意义的ID检测,以及检测之后无意义的逻辑处理。如果定义了一个默认构造函数,
则所有会处理到ID的成员函数都会去执行无意义的ID检测,造成代码臃肿以及无意义的逻辑处理,使用这种(没有缺省构造函数的)类的确有一些限制,
但是当你使用它时,它也给你提供了一种保证:你能相信这个类被正确地建立和高效地实现。