Конструктор копирования и оператор присваивания - PullRequest
48 голосов
/ 20 марта 2011

Если я переопределю operator=, будет ли конструктор копирования автоматически использовать оператор new? Точно так же, если я определю конструктор копирования, operator= автоматически «унаследует» поведение от конструктора копирования?

Ответы [ 5 ]

42 голосов
/ 20 марта 2011

Нет, они разные операторы.

Конструктор копирования предназначен для создания нового объекта.Он копирует существующий объект во вновь созданный объект. Конструктор копирования используется для инициализации нового экземпляра из старого экземпляра.Он не обязательно вызывается при передаче переменных по значению в функции или в качестве возвращаемых значений из функций.

Оператор присваивания должен иметь дело с уже существующим объектом.Оператор присваивания используется для изменения существующего экземпляра, чтобы он имел те же значения, что и значение r, что означает, что экземпляр должен быть уничтожен и повторно инициализирован, если он имеет внутреннюю динамическую память.

Полезная ссылка:

11 голосов
/ 20 марта 2011

Нет. Если вы не определите копию ctor, будет сгенерировано значение по умолчанию (если необходимо). Если вы не определите оператор =, будет сгенерировано значение по умолчанию (при необходимости). Они не используют друг друга, и вы можете изменить их самостоятельно.

5 голосов
/ 20 марта 2011

Нет. Это разные предметы.

Если вас беспокоит дублирование кода между конструктором копирования и оператором присваивания, рассмотрите следующую идиому с именем copy и swap :

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 внутри) при выходе из функции.

1 голос
/ 20 марта 2011

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

0 голосов
/ 20 марта 2011

Нет.

И определенно взгляните на правило трех (или правило пяти при учете значений)

...