仔细区别pointers和references

Pointers和reference之间的另一个重要差异就是,pointers可以被重新赋值,指向另一个对象,reference却总是指向(代表)它最初获得的那个对象。
在此种情况下必须使用reference,当实现某些操作符的时候,最常见的例子就是operator[].这个操作符很特别地必须返回某种”能够被当作assignment赋值对象”的东西。

  1. vector<int> v(10);
  2. v[5] = 10;
  3. *v[5] = 10;//如果operator[]返回pointer,则写法就变成这样来

结论:当知道将要指向一个东西,而且绝对不会改变其指向时,或当实现一个操作符而其语法需求无法由pointers达成,就应该选择reference。任何其他时候,请采用pointers。

绝对不要以多态的方式处理数组

  1. class BST {...};
  2. class BalancedBST: public BST {...};
  3. void printBSTArray(ostream& s, const BST array[], int numElements)
  4. {
  5. for (int i = 0; i < numElements; ++i) {
  6. s << array[i];
  7. }
  8. }
  9. BST BSTArray[10];
  10. ...
  11. printBSTArray(cout, BSTArray, 10); //运行良好
  12. BalancedBST bBSTArray[10];
  13. ...
  14. printBSTArray(cout, bBSTArray, 10); //?无法确定是否运行良好

array所指内存和array+i所指内存两者相差的距离是i * sizeof(数组中的对象)。
derived classes通常比其base classes 有更多的data members,所以derived class objects通常都比其base class objects来的大。
结论:多态和指针算数不能混用,数组对象总会涉及指针的算数运算,所以数组和多态不能混用。