Определение вывода программы с классом, реализующим конструктор копирования и оператор присваивания

Программа напечатает 1213 без пробелов и перевода строки. Создание obj1 и obj3 вызывает обычный конструктор, obj2 — копирующий, а присваивание obj3 — operator=.

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

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

Программа напечатает 1213 без пробелов и перевода строки. Создание obj1 и obj3 вызывает обычный конструктор, obj2 — копирующий, а присваивание obj3 — operator=.

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

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

Условие

Найдите, какой текст будет напечатан в консоли при запуске следующего кода.

#include <iostream>

class A {
public:
    A() {
        std::cout << "1";
    }

    A(const A&) {
        std::cout << "2";
    }

    A& operator=(const A&) {
        std::cout << "3";
        return *this;
    }
};

int main(){
    A obj1;
    A obj2 = obj1;
    A obj3;
    obj3 = obj1;
}

Ответ

Программа напечатает 1213 без пробелов и перевода строки. Создание obj1 и obj3 вызывает обычный конструктор, obj2 — копирующий, а присваивание obj3 — operator=.

Последовательность такова: A obj1 печатает 1; A obj2 = obj1 создаёт новый объект и печатает 2; A obj3 печатает 1; obj3 = obj1 меняет существующий объект и печатает 3.

Знак равенства в объявлении не означает присваивание уже созданному объекту. Неявный деструктор в этом примере ничего не выводит, поэтому дополнительных символов на выходе из main нет.

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

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

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

Подробнее