Я довольно плохо знаком с 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);
}
Класс выводит сообщение каждый раз, когда вызывается его конструктор, чтобы я мог сказать, создается ли новый объект. Исходя из этого, две формы + = я пытаюсь здесь привести к тому же количеству создаваемых объектов.
поскольку +=
обычно изменяет свой левый операнд, вы обычно не реализовать это с точки зрения operator+
(который должен создать временное значение для хранения результата).
Аналогично, поскольку вы не можете разумно выполнить преобразование для левого операнда, это действительно должна быть функция-член.
Utility &Utility::operator+=(Utility const &right) {
intValue += right.intValue;
return *this;
}
Как правило, можно было бы ожидать +=
чтобы изменить левый операнд, было бы лучше, если бы вы избегали его реализации с помощью operator +
это приводит к созданию временной стоимости.
Кроме того,
Utility& operator +=(Utility& left, Utility right)
{
return left = left + right;
}
лучше, чем другие в том смысле, что это возвращает результат. Это позволяет пользователям писать составные выражения, такие как:
Utility utility1 , utility2;
Utility ut += (utility1 += utility2);
Но если вы можете изменить Utility
внутренне без operator+
, будет лучше.