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