メインコンテンツ

コピー コンストラクターが初期化リストで呼び出されていません

コピー コンストラクターが一部のメンバーまたは基底クラスのコピー コンストラクターを呼び出さない

説明

この欠陥は、あるクラスのコピー コンストラクターが、初期化リスト内の以下の項目の "コピー コンストラクター" を呼び出さなかった場合に発生します。

  • そのメンバーのうち 1 つ以上。

  • その基底クラス (該当する場合)。

    基底クラスのコピー コンストラクターの代わりに基底クラスのコンストラクターが呼び出される場合でも、この欠陥は発生します。

リスク

コピー コンストラクターの呼び出しは、初期化リストからのみ実行できます。呼び出しがない場合は、オブジェクトが部分的にしかコピーされない可能性があります。

  • メンバーのコピー コンストラクターが呼び出されないと、そのメンバーがコピーされない可能性があります。

  • 基底クラスのコピー コンストラクターが呼び出されないと、基底クラスのメンバーがコピーされない可能性があります。

修正方法

コピー コンストラクターで完全なコピーが実行されるようにするには、初期化リストにあるすべてのメンバーとすべての基底クラスのコピー コンストラクターを呼び出します。

すべて展開する

class Base {
public:
    Base();
    Base(int);
    Base(const Base&);
    virtual ~Base();
private:
    int ib;
};

class Derived:public Base {
public:
    Derived();
    ~Derived();
    Derived(const Derived& d): Base(), i(d.i) { }
private:
    int i;
};

この例では、クラス Derived のコピー コンストラクターが、クラス Base のコピー コンストラクターではなく、既定のコンストラクターを呼び出しています。

欠陥は、コピー コンストラクター定義にある記号 : に表示されます。ソース コード内での移動のヒントを以下に示します。

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

  • 基底クラス定義に移動するには、まず派生クラス定義に移動します。派生クラス定義で、その派生クラスが基底クラスを継承している場合は、基底クラス名を右クリックして [定義に移動] を選択します。

修正 — 基底クラスのコピー コンストラクターを呼び出す

1 つの修正方法として、クラス Base のコピー コンストラクターを Derived クラスのコピー コンストラクターの初期化リストから呼び出します。

class Base {
public:
    Base();
    Base(int);
    Base(const Base&);
    virtual ~Base();
private:
    int ib;
};

class Derived:public Base {
public:
    Derived();
    ~Derived();
    Derived(const Derived& d): Base(d), i(d.i) { }
private:
    int i;
};

結果情報

グループ: オブジェクト指向
言語: C++
既定値: 手書きコードはオン、生成コードはオフ
コマンド ライン構文: MISSING_COPY_CTOR_CALL
影響度: High

バージョン履歴

R2015b で導入