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++
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода
Синтаксис командной строки: MISSING_COPY_CTOR_CALL
Удар: высоко
Введенный в R2015b