1. ホーム
  2. c++

[解決済み】メンバー初期化リストの使用を推奨する理由は?

2022-04-01 09:46:42

質問

私はコンストラクタでメンバ初期化リストを使うのが好きなのですが、その理由をずっと忘れていました。

あなたは、コンストラクターにメンバー初期化リストを使用しますか?使っている場合、その理由は何ですか?使っていない場合は、その理由を教えてください。

解決方法は?

対象 POD クラス・メンバの場合は、スタイルの問題に過ぎず、違いはありません。 クラスであるクラス・メンバの場合は、デフォルトのコンストラクタが不必要に呼び出されないようにします。 考えてみてください。

class A
{
public:
    A() { x = 0; }
    A(int x_) { x = x_; }
    int x;
};

class B
{
public:
    B()
    {
        a.x = 3;
    }
private:
    A a;
};

この場合、コンストラクタで B のデフォルトコンストラクタを呼び出します。 A を初期化し、さらに a.x を 3 にするのがよいでしょう。 B のコンストラクタから直接 A のコンストラクタをイニシャライザーリストに追加します。

B()
  : a(3)
{
}

を呼び出すだけです。 A 's A(int) のコンストラクタで、デフォルトのコンストラクタではありません。 この例ではその違いはごくわずかですが、たとえば A のデフォルトコンストラクタは、メモリの割り当てやファイルのオープンなど、より多くのことを行います。 不必要にそんなことはしたくないですよね。

さらに、クラスにデフォルトコンストラクタがない場合や const メンバ変数が しなければならない には、イニシャライザー・リストを使用します。

class A
{
public:
    A(int x_) { x = x_; }
    int x;
};

class B
{
public:
    B() : a(3), y(2)  // 'a' and 'y' MUST be initialized in an initializer list;
    {                 // it is an error not to do so
    }
private:
    A a;
    const int y;
};