Первое правило перегрузки операторов: не перегружайте операторов, которые не имеют смысла. Например, оператор «+» может выглядеть хорошим выбором для добавления элементов в списки, но это не так: не все сочтут это использование логичным.
Что касается математических операторов, friend
не требуется.
Типичный способ их определения (который учитывает симметрии и неявные преобразования) следующий:
struct T {
T& operator+=(T const& rhs) {
// the actual addition code
return *this;
}
};
T const operator+(T const& lhs, T const& rhs) {
return T(lhs) += rhs;
};
Однако эта организация не приспособлена для таких операторов, как Matrix
или
Умножение Polynomial
на оператор *=(T const&)
не так тривиально. В этом
В этом случае мы определяем operator*=(T const&)
поверх operator*(T const&, T const&)
, и двоичный файл operator*()
может быть сделан friend
, если нет доступа к внутренним данным - это использование friend
не является нарушением инкапсуляции но применение инкапсуляции - или в целях оптимизации.
Если вы действительно хотите исключить большинство временных значений, взгляните на шаблоны выражений (см. Blitz ++, boost.ublas, newmat, ...) или дождитесь ссылок на значения C ++ 0x.