Определение синтаксиса оператора Plusequals

Я довольно плохо знаком с c ++ и пытаюсь узнать о пользовательских операторах. Проблема, с которой я сталкиваюсь в настоящее время, связана с определением моего собственного оператора + = и наилучшим способом решения этой проблемы. Это включает в себя простой класс с открытым членом int (intValue), к которому можно добавить. Насколько я могу судить, следующие два примера кода, которые я пробовал по одному, работают точно так же в моей программе. Под «точно таким же» я имею в виду тот же результат и создаю одинаковое количество объектов.

Какой из них более правильный (стандартная практика) и почему?

Utility& operator +=(Utility& left, Utility right)
{
return left = left + right;
}

Или же

void operator +=(Utility& left, Utility right)
{
left = left + right;
}

И, если это имеет значение, оператор, которого они называют:

Utility operator +(Utility left, Utility right)
{
return Utility(left.intValue + right.intValue);
}

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

0

Решение

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

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

Utility &Utility::operator+=(Utility const &right) {
intValue += right.intValue;
return *this;
}
2

Другие решения

Как правило, можно было бы ожидать += чтобы изменить левый операнд, было бы лучше, если бы вы избегали его реализации с помощью operator + это приводит к созданию временной стоимости.

Кроме того,

Utility& operator +=(Utility& left, Utility right)
{
return left = left + right;
}

лучше, чем другие в том смысле, что это возвращает результат. Это позволяет пользователям писать составные выражения, такие как:

Utility utility1 , utility2;
Utility ut += (utility1 += utility2);

Но если вы можете изменить Utility внутренне без operator+, будет лучше.

2