Copy constructor not called in initialization list

Конструктор копирования не вызывает конструкторы копирования некоторых представителей или базовых классов

Описание

Этот дефект возникает, когда конструктор копирования класса не вызывает конструктор копирования следующего в его списке инициализации:

  • Одни или несколько его представителей.

  • Его базовые классы, когда применимо.

    Дефект возникает, даже когда вместо конструктора копирования базового класса вызывается конструктор базового класса.

Риск

Вызовы конструкторов копирования могут выполняться только из списка инициализации. Если вызовы отсутствуют, возможно, что объект скопирован только частично.

  • Если конструктор копирования представителя не вызывается, возможно, что представитель не копируется.

  • Если конструктор копирования базового класса не вызывается, возможно, что члены базового класса не копируются.

Зафиксировать

Если необходимо, чтобы конструктор копирования выполнил полную копию, вызовите конструктор копирования всех представителей и всех базовых классов в его списке инициализации.

Примеры

расширить все

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.

Дефект появляется на : символ в определении конструктора копирования. Ниже приведены некоторые советы по навигации в исходном коде:

  • Чтобы перейти к определению класса, щелкните правой кнопкой мыши представитель, который инициализирован в конструкторе. Выберите Go To Definition. В определении класса отображаются члены класса, включая те представители, чьи конструкторы копий не вызываются.

  • Чтобы перейти к определению базового класса, сначала перейдите к определению производного класса. В определении производного класса, где производный класс наследует от базового класса, щелкните правой кнопкой мыши имя базового класса и выберите Go To Definition.

Коррекция - Вызов конструктора копирования базового класса

Одной из возможных коррекций является вызов конструктора копирования класса 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++
По умолчанию: On для рукописного кода, off для сгенерированного кода
Синтаксис командной строки: MISSING_COPY_CTOR_CALL
Влияние: Высокий
Введенный в R2015b