Оператор копирования и оператор присваивания

Если я переопределяю 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

Нет, это не тот же оператор.