Подскажите правильный синтаксис перегрузки оператора-челена operator +=
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Что именно он должен возвращать? Экземпляр, или ссылку на экземпляр?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Возможен и тот и другой вариант. Разница в том, где создаётся этот объект. Если за пределами твоего оператора, т.е. ты принимаешь в оператор ссылку на уже существующий объект и возвращаешь его же, то возвращаешь ссылку на этот объект. Если же в теле оператора создаётся новый экземпляр объекта, то и возвращать нужно экземпляр этого объекта.
Энто как += может создавать новый объект?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Что в этом удивительного? Взять к примеру какой-нибудь строковый класс. В большинстве библиотек на С++ оператор += добавляет входное значение к внутреннему содержимому строки и возвращает ссылку на сам объект.
А на платформе .NET внутреннее содержимое строки остаётся неизменным, вместо этого порождается новый объект строки, содержащий в себе текст родительской строки с добавлением нового текста. Эта новая строка возвращается в качестве результата оператора += как экземпляр нового объекта.
А на платформе .NET внутреннее содержимое строки остаётся неизменным, вместо этого порождается новый объект строки, содержащий в себе текст родительской строки с добавлением нового текста. Эта новая строка возвращается в качестве результата оператора += как экземпляр нового объекта.
Поумнеть несложно, куда труднее от дури избавиться.
Объекты создаются конструкторами, а не операторами. Ну + ещё ладно, он вынужден вызвать конструктор из-за того, что сумма в общем случае не совпадает ни с одним слагаемым. То же относится к -, * и /. Но += помещает сумму в левый операнд. Откуда здесь возмётся новый объект?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Вы ещё машину Бебиджа помяните. И произведения Ады Байрон.А на платформе .NET внутреннее содержимое строки остаётся неизменным,
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
-
- Сообщения: 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
Да возвращать можно в принципе что угодно, это решает сам разработчик в контексте своей задачи. Можно даже вообще ничего не возвращать, если объявить перегружаемый оператор как void. Всё зависит от того, каким образом этот оператор будет использован в программном коде.
Absurd писал(а):чтобы работал такой кодКод: Выделить всё
BigDecimal operator+[/quote]А ничего, что я спрашивал совсем про другой оператор?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Сионист, на твой вопрос два ответа.
С точки зрения языка, указанный оператор может возвращать абсолютно любой тип, от ссылки или значения текущего класса, до void или даже любого другого произвольного класса. Никаких синтаксических ограничений.
Однако с логической точки зрения, оператор += подразумевает изменение самого объекта, для которого вызван, потому для того, чтобы соблюсти принцип наименьшего удивления, он должен возвращать самого себя (иначе говоря, тип возвращаемого значения должен быть ссылкой на текущий класс, а в return должен всегда стоять разыменовынный this).
С точки зрения языка, указанный оператор может возвращать абсолютно любой тип, от ссылки или значения текущего класса, до void или даже любого другого произвольного класса. Никаких синтаксических ограничений.
Однако с логической точки зрения, оператор += подразумевает изменение самого объекта, для которого вызван, потому для того, чтобы соблюсти принцип наименьшего удивления, он должен возвращать самого себя (иначе говоря, тип возвращаемого значения должен быть ссылкой на текущий класс, а в return должен всегда стоять разыменовынный this).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.