Когда вызываются копирующий конструктор и оператор присваивания

Копирующий конструктор создаёт новый объект из существующего, а operator= меняет уже созданный. Но исходный пример сначала нужно исправить: в классе нет конструктора по умолчанию.

Короткий ответ

Что ответить на собеседовании

Копирующий конструктор создаёт новый объект из существующего, а operator= меняет уже созданный. Но исходный пример сначала нужно исправить: в классе нет конструктора по умолчанию.

Подробный разбор

Ответ с пояснениями

Условие

В структуре CopyAssignExample реализованы как пользовательский конструктор копирования, так и оператор копирующего присваивания. Требуется определить, в каких случаях будет задействован каждый из них.

struct CopyAssignExample {
    CopyAssignExample(const CopyAssignExample& other) {
        x = other.x;
        y = other.y;
        z = other.z;
    }

    CopyAssignExample& operator=(const CopyAssignExample& other) {
        x = other.x;
        y = other.y;
        z = other.z;
        return *this;
    }

    int x;
    int y;
    int z;
};

void SomeFunc() {
    // разместите здесь примеры, демонстрирующие вызов конструктора копирования и оператора присваивания
}

Пример использования:

CopyAssignExample a;            // обычный конструктор по умолчанию
CopyAssignExample b = a;       // вызывается копирующий конструктор

CopyAssignExample c;            // обычный конструктор по умолчанию
c = b;                          // вызывается оператор копирующего присваивания

Опишите, какие конструкции кода приводят к вызову каждого из методов.

Ответ

Копирующий конструктор создаёт новый объект из существующего, а operator= меняет уже созданный. Но исходный пример сначала нужно исправить: в классе нет конструктора по умолчанию.

Добавьте CopyAssignExample() : x(0), y(0), z(0) {}. После этого:

CopyAssignExample a;
CopyAssignExample b = a; // Конструктор копирования.
CopyAssignExample c(a);  // Тот же конструктор.
c = b;                  // Копирующее присваивание.

Знак = в объявлении b означает инициализацию, а не вызов operator=. Пользовательский копирующий конструктор подавляет неявное объявление конструктора без аргументов. Инициализация полей нулями также предотвращает чтение неинициализированных int при копировании.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее