MoreEffectiveC++ 1-5

項目1:ポインタと参照の違い

=ポインタ=
・nullが存在する。
 なので、nullかどうかのチェックが必要になる。

=参照=
・常にオブジェクトを参照する

項目2:C++スタイルのキャストを愛用する

static_cast <型名> (式)
const_cast <型名> (式)
dynamic_cast <型名> (式)
reinterpret_cast <型名> (式)

C++のキャストはキャストが失敗したとき、
nullになったり、例外を出す。

項目3:配列をポリモルフィズム的には扱っていけない

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

void printBSTArray(ostrem& s,
const BST array[],
int numElements)
{
for(int i = 0; i < numElements; i++)
s << array[i];
}

BalancedBST bBSTArray[10];

printBSTArray(cout, bBSTArray, 10);

printBSTArrayのforでは
BSTのサイズをもとに配列の位置を計算するが、
BalancedBSTの配列を関数に渡しても、
BalancedBSTのサイズよりも小さいBSTのサイズで計算するため、
配列の要素array[i]の位置がおかしくなる。

項目4:根拠のない省略時コンストラクタを避ける

省略時コンストラクタをなんとなく作ると、
ちゃんと生成されたかのチェックをしないといけなくなる。

項目5:ユーザ定義の変換関数には気をつけよう

explicitをつけるか、
プロキシーオブジェクトを作ることで回避する。

template
class Array{
public:
...
explicit Array(int size);
...
};

template
class Array{
public:
class ArraySize{
public:
ArraySize(int numElements): theSize(numElements) {}
int size() const { return theSIze; }
private:
int theSize;
};

Array(int lowBound, int highBound);
Array(ArraySize size);
};