Копирующий конструктор создаёт новый объект из существующего, а 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 при копировании.