Вы реализуете двоичный файл operator+
, определение которого берет два элемента (нетронутыми) и генерирует третий элемент с результатом сложения.Причина дополнительного feetInches
объекта в коде заключается в том, что вы не хотите изменять левый объект.Что касается понимания оператора, может быть, было бы проще, если бы вы рассмотрели реализацию:
feetInches operator+( feetInches const & other ) const {
return feetInches( feet+other.feet, inches+other.inches );
}
Исходный код просто разбивает этот единственный оператор на 4 различных оператора: конструкция объекта (должна быть именованной переменной длябудет использоваться позже), устанавливая два поля и возвращая объект.
В качестве альтернативы рекомендуемый подход к перегрузке операторов может быть немного другим:
class feetInches {
int feet, inches;
public:
feetInches( int feet = 0, int inches = 0 )
: feet(feet), inches(inches) {}
// Implement += internally [*]
feetInches& operator+=( feetInches const & rhs ) {
feet += rhs.feet;
inches += rhs.inches;
return *this;
}
};
// Implement + as a free function taking the first element by value:
feetInches operator+( feetInches lhs, feetInches const & rhs ) {
lhs += rhs; // Reuse += implementation, no need to repeat
return lhs;
}
По причинам:
- Гибкость: допускает
operator+
и operator+=
с одной реализацией - Симметрия типа: позволяет компилятору выполнять неявные преобразования в обоих операндах
1 + obj
, obj + 1
оба будут работать с этой единственной реализацией, в подходе функции-члена 1 + obj
не может быть разрешен компилятором, так как он не может преобразовать первый элемент перед вызовом функции-члена
- Эффективность: принятие первого аргумента по значению означает, что временные значения, используемые в качестве первого аргумента, могут бытьоптимизирован.
Обратите внимание, что в измененной версии все еще есть три объекта: исходная левая сторона, копия в качестве первого аргумента operator+
, которая возвращается, и правая часть, мы имеемне удален объект.Кроме того, эта реализация для этого конкретного типа требует дополнительной копии в операторе возврата operator+
(копия из аргумента в возвращаемое значение не может быть исключена), но для более сложных типов, которые могут быть перемещены ,оператор возврата будет перемещать содержимое объекта.
Подробнее о перегрузке оператора здесь
[*] Это решение по проекту, operator+=
может быть реализовано как свободная функция, но можно утверждать (по крайней мере, я так), что семантически +=
является операцией первого аргумента.