Почему я не должен перегружать оператор присваивания в C ++? - PullRequest
2 голосов
/ 13 января 2012

Вот мой код:

class Example {
 ...declarations/definitions...
};

Example operator + (Example e)
{
 Example temp;
 ...do addition...
 return temp;
}

//main
void main()
{
 Example a(1,2);
 Example b(3,4);
 Example c;
 c = a+b;
}

Что меня смущает, так это то, что мне пришлось перегрузить оператор +, чтобы он работал с векторами, но как насчет знака равенства =?Я назначаю один вектор другому, разве я не должен перегружать его тоже?Или это уже предоставлено нам?Спасибо.

Ответы [ 6 ]

4 голосов
/ 13 января 2012

Язык по умолчанию обеспечивает operator= для вас автоматически, если ваш класс назначается по умолчанию (например, если у него есть какие-либо ссылочные члены, он не будет назначаться без вашей специальной работы).Все, что он делает, это назначает базу и каждого члена индивидуально.

3 голосов
/ 13 января 2012

Со страницы википедии :

Версия по умолчанию [оператора присваивания] выполняет копирование по элементам, где каждый член копируется своим собственным оператором присваивания (который также может быть объявлен программистом или сгенерирован компилятором).

2 голосов
/ 13 января 2012

Если вы не объявляете оператор копирования-присвоения в своем классе, тогда он неявно объявляется для вас (и неявно определяется, если вы когда-либо его используете).

Неявный оператор назначит каждому членуваш объект, если это возможно;в противном случае (если какой-либо элемент является ссылкой, или const, или имеет частный или удаленный оператор назначения копирования), вы получите ошибку компиляции.

Аналогично, если вы не объявите конструктор копирования, тогда вы получите неявный, который будет копировать каждого члена.Ваш код использует это в operator+, чтобы скопировать аргумент и возвращаемое значение.

1 голос
/ 13 января 2012

Оператор присваивания предоставляется по умолчанию вместе с конструктором копирования и конструктором по умолчанию.Он присваивает значение каждого элемента данных соответствующему элементу данных в другом объекте (т. Е. Мелкой копии).

0 голосов
/ 13 января 2012

C ++ предоставляет для вас конструктор копирования по умолчанию, который используется для назначения , он копирует член класса за членом, используя их (также, возможно, по умолчанию) конструкторы копирования.

0 голосов
/ 13 января 2012

А std::vector?Если это так, std::vector по умолчанию реализует оператор присваивания.Из man-страницы:

"Назначает копию вектора x в качестве нового содержимого для векторного объекта.

Элементы, содержащиеся в векторном объекте перед вызовом, удаляются и заменяются копиямите в векторе x, если они есть.

После вызова этой функции-члена и векторный объект, и вектор x будут иметь одинаковый размер и сравниваться равными друг другу. "

edit-на днях я собираюсь сначала представить ответ!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...