More Effective C++ 項目4 根拠のない省略時コンストラクタを避ける
新訂版 More Effective C++ (AddisonーWesley professional co)
- 作者: スコット・メイヤーズ,安村通晃,伊賀聡一郎,飯田朱美,永田周一
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2007/06/29
- メディア: 単行本(ソフトカバー)
- 購入: 8人 クリック: 129回
- この商品を含むブログ (43件) を見る
項目4 根拠のない省略時コンストラクタを避ける
オブジェクト生成時に情報が必要なはずのクラスでは、引数なしコンストラクタはありえない。
逆に、引数なしコンストラクタがないということは、何か情報を与えない限りはオブジェクト生成はさせないぞ、という制限・意思表示なわけだ。
でも引数なしコンストラクタがないと、3つのケースで問題がある。
1.配列を作れない
class A { public: A(int IDNumber); .... }; A a[10]; // エラー! コンストラクタを呼べない A* ap = new A[10]; // エラー!
2.テンプレートのコンテナクラスに不向き
vectorは平気だが、多くのテンプレートは内部で配列を使うため、引数なしコンストラクタを必要とする。
3.仮想基底クラス
仮想基底クラスに引数なしコンストラクタがないと、全ての情報を派生クラスが与えなければならない。
派生クラスを作るには、仮想基底クラスのコンストラクタの実引数を、熟知し理解しなければならない。
デフォルト引数で一応回避できる。
class A { public: A(int IDNumber = UNSPECIFIED); ... private: static const int UNSPECIFIED; };
こうすると引数なしのオブジェクト生成に対応できるが、メンバ関数を作る際、正常に生成されたのかどうかをチェックしなければならない。
まとめ
意味を成さないオブジェクトの生成を防ぐため、オブジェクトの全てのフィールドが初期化されることを保証したコンストラクタにするべき。