条款3-4:绝对不要以多态的方式处理数组与default constructor

条款3:绝对不要以多态的方式处理数组

class BST{ ...... };

class BalancedBST:public BST{.......};


void printBST(ostream& s,const BST array[ ],int num)

{

   for(int i = 0;i<num;i++)

     s<<array[i];

}

当你传入BST的数组是没有什么问题的。

现在传入BalanceBST呢?

BalanceBST bBST[10];

printBST(cout,bBST,10);

编译器会毫无怨言的接受,但是我们看看这个循环

for(int i = 0;i<num;++i)

 s<<array[i];

我们知道array与array[i]之间的距离为i*sizeof(BST),所以编译器每次都是这样移动的。现在我们传入了派生类的对象,那么sizeof(BalanceBST)与sizeof(BST)不一定相等。所以array[i]移动的距离也不一定相等。

同样你用一个指向base的指针删除一个指向派生类的数组,也是有可能出现错误的。


条款4:非必要不提供default constructor

所谓default constructor是否提供的问题有很大的争论。有些对象提供default constructor 构造出来的对象是没任何意义的,但是如果没有,对于定义数组对象又不方便。假如添加了default constructor那么每次都要检查是否有效,对程序的效率造成影响。本条款的意思是非必要就不提供default constructor了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值