Программа напечатает 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 нет.