Подскажите правильный синтаксис перегрузки оператора-челена operator +=

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Что именно он должен возвращать? Экземпляр, или ссылку на экземпляр?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Возможен и тот и другой вариант. Разница в том, где создаётся этот объект. Если за пределами твоего оператора, т.е. ты принимаешь в оператор ссылку на уже существующий объект и возвращаешь его же, то возвращаешь ссылку на этот объект. Если же в теле оператора создаётся новый экземпляр объекта, то и возвращать нужно экземпляр этого объекта.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Энто как += может создавать новый объект?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Что в этом удивительного? Взять к примеру какой-нибудь строковый класс. В большинстве библиотек на С++ оператор += добавляет входное значение к внутреннему содержимому строки и возвращает ссылку на сам объект.
А на платформе .NET внутреннее содержимое строки остаётся неизменным, вместо этого порождается новый объект строки, содержащий в себе текст родительской строки с добавлением нового текста. Эта новая строка возвращается в качестве результата оператора += как экземпляр нового объекта.
Поумнеть несложно, куда труднее от дури избавиться.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Объекты создаются конструкторами, а не операторами. Ну + ещё ладно, он вынужден вызвать конструктор из-за того, что сумма в общем случае не совпадает ни с одним слагаемым. То же относится к -, * и /. Но += помещает сумму в левый операнд. Откуда здесь возмётся новый объект?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

А на платформе .NET внутреннее содержимое строки остаётся неизменным,
Вы ещё машину Бебиджа помяните. И произведения Ады Байрон.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Всегда ссылку на себя (return *this) чтобы работал такой код

Код: Выделить всё

BigDecimal operator+(const BigDecimal& lho, const BigDecimal& rho) {
  return BigDecimal(lho) += rho; // Работает сначала конструктор копирования, потом operator+=, 
                                     // потом конструктор копирования или перемещения для
                                     // передачи результата в вызывающий код 
                                     // который в свою очередь принимает в качестве параметра  
                                     // ссылку на промежуточный инстанс которую вернул operator +=
}
2B OR NOT(2B) = FF
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Да возвращать можно в принципе что угодно, это решает сам разработчик в контексте своей задачи. Можно даже вообще ничего не возвращать, если объявить перегружаемый оператор как void. Всё зависит от того, каким образом этот оператор будет использован в программном коде.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Absurd писал(а):чтобы работал такой код

Код: Выделить всё

BigDecimal operator+[/quote]А ничего, что я спрашивал совсем про другой оператор?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист, на твой вопрос два ответа.

С точки зрения языка, указанный оператор может возвращать абсолютно любой тип, от ссылки или значения текущего класса, до void или даже любого другого произвольного класса. Никаких синтаксических ограничений.

Однако с логической точки зрения, оператор += подразумевает изменение самого объекта, для которого вызван, потому для того, чтобы соблюсти принцип наименьшего удивления, он должен возвращать самого себя (иначе говоря, тип возвращаемого значения должен быть ссылкой на текущий класс, а в return должен всегда стоять разыменовынный this).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить