【More Effective C++】条款4:避免无用的缺省构造函数

背景:

  • 在特定场景下,使用无参的构造函数没有意义,比如微信联系人必须包含姓名等唯一标识;
  • 提供无意义的无参构造函数会影响类的工作效率,比如成员函数必须测试所有的对象是否都被正确地初始化;
  • 但是没有无参构造函数,会存在一些使用上的限制。

限制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:

  • 不提供缺省构造函数的虚基类,在后续派生时候必须理解兵提供给虚基类构造函数的参数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨主任o_o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值