exponenta event banner

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

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

Описание

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

  • Один или несколько его членов.

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

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

Риск

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

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

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

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

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

Примеры

развернуть все

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.

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

  • Чтобы перейти к определению класса, щелкните правой кнопкой мыши элемент, инициализированный в конструкторе. Выберите «Перейти к определению». В определении класса отображаются элементы класса, включая элементы, конструкторы копирования которых не вызываются.

  • Для перехода к определению базового класса сначала перейдите к определению производного класса. В определении производного класса, где производный класс наследует от базового класса, щелкните правой кнопкой мыши имя базового класса и выберите «Перейти к определению».

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

Одной из возможных корректировок является вызов конструктора копирования класса 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
Воздействие: Высокое
Представлен в R2015b