背景:
- 在特定场景下,使用无参的构造函数没有意义,比如微信联系人必须包含姓名等唯一标识;
- 提供无意义的无参构造函数会影响类的工作效率,比如成员函数必须测试所有的对象是否都被正确地初始化;
- 但是没有无参构造函数,会存在一些使用上的限制。
限制1:
- 不能直接创建数组,错误是没有匹配到无参构造函数
class EquipmentPiece {
public:
EquipmentPiece(int IDNumber) {}
};
EquimentPiece bestPieces[10];
// EquimentPiece *bestPieces = new EquimentPiece[10];
// error: no matching function for call to ‘EquimentPiece::EquimentPiece()’
解决办法:
- 非堆数据可以在数组定义时提供必要的参数:
- 在堆数组定义中,用指针数组来代替对象数组;
PEP bestPieces[10];
// PEP *bestPieces = new PEP[10];
int NumberList[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for (int i = 0; i < 10; i++) {
bestPieces[i] = new EquipmentPiece(NumberList[i]);
}
指针数组缺陷以及优化方法:
- 必须手动删除数组里每个指针所指向的对象,避免发生内存泄漏,可以用智能指针来解决;
- 增加了容纳指针内存分配量,使用placement new 方法解决;
void *rawMemory = operator new[](10*sizeof(EquipmentPiece));
EquipmentPiece *bestPieces = static_cast<EquipmentPiece*>(rawMemory);
for (int i = 0; i < 10; i++) {
new (&bestPieces[i]) EquipmentPiece(NumberList[i]);
}
for (int i = 0; i < 10; i++) {
bestPieces[i].~EquipmentPiece();
}
operator delete[](rawMemory);
限制2:
- 无法在基于模板的容器类里使用,因为实例化模板时应该提供一 个缺省构造函数。
template<class T>
class Array {
public:
Array(int size) {
data = new T[size];
}
private:
T *data;
};
Array<EquipmentPiece> bestPiecesArray(5);
// error: no matching function for call to ‘EquipmentPiece::EquipmentPiece()’
// data = new T[size];
限制3:
- 不提供缺省构造函数的虚基类,在后续派生时候必须理解兵提供给虚基类构造函数的参数

被折叠的 条评论
为什么被折叠?



