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

根拠のない省略時コンストラクターを避ける
"省略時コンストラクター"とは"引数が必要ないコンストラクタ"のことです。この項のまとめでは、"引数が必要ないコンストラクタ"で記述を統一します。



法人を管理するクラスを考えます。法人にはID番号を必ず指定するとします。

class EquipmentPiece{
public:
    EquipmentPiece(int IDNumber);
    ...
};

このクラスのコンストラクタには、引数を指定する必要があります。

もし仮に、デフォルト引数を定義してしまうと、ほとんどのメンバ関数がIDがセット済みかを確かめなくてはならなくなります。

class EquipmentPiece{
public:
    EquipmentPiece(int IDNumber = UNSPECIFIED) : id_(IDNumber ){...}
    int getID() const {if(id_ != UNSPECIFIED) return id_; ...} //UNSPECIFIEDでないか確かめなくてはならない。
    ...
};

なので、必要ならば、引数が必要なコンストラクタを使うべきです。根拠なく引数が必要ないコンストラクタを定義しないようにします。



引数が必要なコンストラクタを使うときには、3つの注意点があります。
1,配列を動的に生成できない。
  -> ポインタの配列かplacement newで代用する。その時のdeleteに注意する。
2,内部で配列を作るテンプレートに、引数が必要なコンストラクタを含むクラスを指定できない。
3,引数が必要なコンストラクタを含むクラスを継承したすべてのクラスで、基底クラスのコンストラクタを明示的に呼び出さなくてはならない。