Страница 1 из 2

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

Добавлено: 12 дек 2015, 14:11
Сионист
Что именно он должен возвращать? Экземпляр, или ссылку на экземпляр?

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

Добавлено: 12 дек 2015, 14:57
WinMain
Возможен и тот и другой вариант. Разница в том, где создаётся этот объект. Если за пределами твоего оператора, т.е. ты принимаешь в оператор ссылку на уже существующий объект и возвращаешь его же, то возвращаешь ссылку на этот объект. Если же в теле оператора создаётся новый экземпляр объекта, то и возвращать нужно экземпляр этого объекта.

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

Добавлено: 12 дек 2015, 15:11
Сионист
Энто как += может создавать новый объект?

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

Добавлено: 12 дек 2015, 16:19
Decoder
Что в этом удивительного? Взять к примеру какой-нибудь строковый класс. В большинстве библиотек на С++ оператор += добавляет входное значение к внутреннему содержимому строки и возвращает ссылку на сам объект.
А на платформе .NET внутреннее содержимое строки остаётся неизменным, вместо этого порождается новый объект строки, содержащий в себе текст родительской строки с добавлением нового текста. Эта новая строка возвращается в качестве результата оператора += как экземпляр нового объекта.

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

Добавлено: 12 дек 2015, 16:33
Сионист
Объекты создаются конструкторами, а не операторами. Ну + ещё ладно, он вынужден вызвать конструктор из-за того, что сумма в общем случае не совпадает ни с одним слагаемым. То же относится к -, * и /. Но += помещает сумму в левый операнд. Откуда здесь возмётся новый объект?

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

Добавлено: 12 дек 2015, 16:35
Сионист
А на платформе .NET внутреннее содержимое строки остаётся неизменным,
Вы ещё машину Бебиджа помяните. И произведения Ады Байрон.

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

Добавлено: 12 дек 2015, 19:07
Absurd
Всегда ссылку на себя (return *this) чтобы работал такой код

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

BigDecimal operator+(const BigDecimal& lho, const BigDecimal& rho) {
  return BigDecimal(lho) += rho; // Работает сначала конструктор копирования, потом operator+=, 
                                     // потом конструктор копирования или перемещения для
                                     // передачи результата в вызывающий код 
                                     // который в свою очередь принимает в качестве параметра  
                                     // ссылку на промежуточный инстанс которую вернул operator +=
}

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

Добавлено: 13 дек 2015, 00:35
WinMain
Да возвращать можно в принципе что угодно, это решает сам разработчик в контексте своей задачи. Можно даже вообще ничего не возвращать, если объявить перегружаемый оператор как void. Всё зависит от того, каким образом этот оператор будет использован в программном коде.

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

Добавлено: 13 дек 2015, 08:02
Сионист
Absurd писал(а):чтобы работал такой код

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

BigDecimal operator+[/quote]А ничего, что я спрашивал совсем про другой оператор?

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

Добавлено: 14 дек 2015, 09:33
Romeo
Сионист, на твой вопрос два ответа.

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

Однако с логической точки зрения, оператор += подразумевает изменение самого объекта, для которого вызван, потому для того, чтобы соблюсти принцип наименьшего удивления, он должен возвращать самого себя (иначе говоря, тип возвращаемого значения должен быть ссылкой на текущий класс, а в return должен всегда стоять разыменовынный this).