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

来源:互联网 发布:oracle数据库linux安装 编辑:程序博客网 时间:2024/06/06 18:12

条款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了。

原创粉丝点击