メインコンテンツ

コンストラクターでメンバーが初期化されません

コンストラクターでクラスのメンバーの一部が初期化されない

説明

この欠陥は、クラス コンストラクター内の少なくとも 1 つの実行パスで、クラスのデータ メンバーの一部が初期化されなかった場合に発生します。

この欠陥は、次の場合には表示されません。

  • コンストラクターが空。

  • 初期化されていないメンバーがコードで使用されていない。

リスク

コンストラクターが初期化されていないメンバーを後で読み取ると、意図しない値になる可能性があります。

コンストラクター内のすべてのメンバーを初期化すると、ユーザー クラスの使用が簡単になります。個別のメソッドを呼び出してメンバーを初期化してからそのメンバーを読み取ると、値が初期化されていないという事態は回避できます。しかし、ユーザー クラスを使用する第三者は、初期化メソッドが呼び出される "前に" クラス メンバーを読み取ることができます。コンストラクターはクラスのオブジェクトが作成される際に呼び出されるので、すべてのメンバーをコンストラクターで初期化しておくと、初期化されてない値が後で見つかることはなくなります。

修正方法

ベスト プラクティスとして、すべてのメンバーをコンストラクターで、できれば初期化リストを使って初期化します。

すべて展開する

class MyClass {
public:
    explicit MyClass(int);
private:
    int _i;
    char _c;
};

MyClass::MyClass(int flag) {
    if(flag == 0) {
        _i = 0;
        _c = 'a';
    }
    else {
        _i = 1;
    }
}

この例では、flag が 0 でない場合、メンバー _c は初期化されません。

欠陥は、コンストラクターの右 (閉じ) 中かっこに表示されます。ソース コード内での移動のヒントを以下に示します。

  • [結果の詳細] ペインで、初期化されていないメンバーを確認します。

  • クラス定義に移動するには、コンストラクター内で初期化されているメンバーを右クリックします。[定義に移動] を選択します。クラス定義では、コンストラクター内で初期化されていないメンバーを含め、すべてのメンバーを確認できます。

修正 — すべての実行パスのメンバーをすべて初期化

1 つの修正方法として、クラス MyClass のすべてのメンバーを flag のすべての値について初期化します。

class MyClass {
public:
    explicit MyClass(int);
private:
    int _i;
    char _c;
};

MyClass::MyClass(int flag) {
    if(flag == 0) {
        _i = 0;
        _c = 'a';
    }
    else {
        _i = 1;
        _c = 'b';
    }
}

結果情報

グループ: オブジェクト指向
言語: C++
既定値: オフ
コマンド ライン構文: NON_INIT_MEMBER
影響度: Medium

バージョン履歴

R2015b で導入