Если я переопределяю operator=
, будет ли конструктор копирования автоматически использовать новый оператор? Точно так же, если я определяю конструктор копирования, будет ли operator=
автоматически "наследовать" поведение от конструктора копирования?
Оператор копирования и оператор присваивания
Ответ 1
Нет, это разные операторы.
Конструктор копирования предназначен для создания нового объекта. Он копирует существующий объект в новый объект. Конструктор копирования используется для инициализации нового экземпляра из старого пример. Он не обязательно вызывается при передаче переменных по значениям в функции или как возвращаемые значения из функций.
Оператор присваивания должен иметь дело с уже существующим объектом. Оператор присваивания используется для изменения существующего экземпляра, чтобы иметь те же значения, что и значение r, что означает, что экземпляр должен быть уничтожен и повторно инициализирован, если он имеет внутреннюю динамическую память.
Полезная ссылка:
Ответ 2
Нет. Если вы не определяете копию ctor, будет генерироваться по умолчанию (при необходимости). Если вы не определите оператор =, будет генерироваться значение по умолчанию (если необходимо). Они не используют друг друга, и вы можете изменить их самостоятельно.
Ответ 3
Нет. Это разные объекты.
Если ваша проблема связана с дублированием кода между конструктором копирования и оператором присваивания, рассмотрите следующую идиому, названную копировать и свопировать:
struct MyClass
{
MyClass(const MyClass&); // Implement copy logic here
void swap(MyClass&) throw(); // Implement a lightweight swap here (eg. swap pointers)
MyClass& operator=(MyClass x)
{
x.swap(*this);
return *this;
}
};
Таким образом, operator=
будет использовать конструктор копирования для создания нового объекта, который будет заменен на *this
и выпущен (со старым this
внутри) при выходе функции.
Ответ 4
Нет, это не тот же оператор.
Ответ 5
Нет.
И определенно посмотрите правило из трех (или правило пять при принятии значений rvalues)