ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

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

新訂版 More Effective C++ (AddisonーWesley professional co)

新訂版 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;
};

こうすると引数なしのオブジェクト生成に対応できるが、メンバ関数を作る際、正常に生成されたのかどうかをチェックしなければならない。

まとめ
意味を成さないオブジェクトの生成を防ぐため、オブジェクトの全てのフィールドが初期化されることを保証したコンストラクタにするべき。