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);
};