Конструктор копирования создает новый объект как копию существующего, тогда как оператор присваивания модифицирует уже существующий объект, заменяя его содержимое копией другого объекта.
class Example {
public:
// Конструктор копирования
Example(const Example& other);
// Оператор присваивания
Example& operator=(const Example& other);
};
Характеристика | Конструктор копирования | Оператор присваивания |
---|---|---|
Когда вызывается | При создании нового объекта | При присваивании существующему объекту |
Возвращаемое значение | Нет (не возвращает ничего) | Возвращает ссылку на объект (*this) |
Инициализация членов | Инициализирует все члены | Заменяет значения существующих членов |
Проверка самоприсваивания | Не требуется | Обязательна |
Example a; // Обычный конструктор
Example b(a); // Конструктор копирования
Example c = a; // Тоже конструктор копирования
b = c; // Оператор присваивания
Example::Example(const Example& other)
: member1(other.member1), member2(other.member2) {
// Инициализация нового объекта
}
Example& Example::operator=(const Example& other) {
if (this != &other) { // Проверка самоприсваивания
member1 = other.member1;
member2 = other.member2;
}
return *this; // Возвращаем ссылку на текущий объект
}
Оба метода должны учитывать:
Продвинутый способ реализации оператора присваивания:
Example& Example::operator=(Example other) { // Параметр по значению
swap(*this, other); // Обмен содержимым
return *this; // other уничтожится с старыми данными
}
Основные различия:
Правильная реализация обоих методов критически важна для безопасной работы с классами, управляющими ресурсами.