2009-04-22 4 views
2

Среди всех вещей, которые я изучил на C++ (что не так много), перегрузка оператора кажется самой сложной. В общих чертах, когда лучше написать операторную перегрузку как функцию друга? Когда мне нужно объяснять использование *this? Всегда ли вредно использовать временный объект?Каков наилучший способ реализации перегрузки оператора?

ответ

2

Ответ Нила правильный. Кроме того, this link предоставляет много хороших сведений о том, когда, где, почему и как использовать различные типы перегрузки операторов на C++.

В общем, я бы попытался придерживаться перегрузок, которые являются интуитивно понятными - использование оператора «+» должно отражать что-то аналогичное добавлению и т. Д. Если вы обнаружите, что выполняете строковые сравнения с оператором «+» или что-то вроде этого, вы, вероятно, должны использовать стандартные функции.

4

Перегрузка оператора магическим абуртом - такие перегрузки - это просто функции со странно выглядящими именами. Таким образом, вы пишете перегрузки операторов так же, как и вы именовали функцию. На самом деле, часто бывает полезно сначала написать именованную функцию - вы всегда можете изменить ее на оператора позже.

Единственное, что вы должны быть осведомлены о том, что компилятор использует пару ваших операторов:

  • оператор =() при хранении вещей в коллекциях
  • оператор <() при сортировке/поиске вещей
+0

многие библиотеки также используют оператор() для обработки объектных объектов –

+0

Действительно, и оператор == используется другими, и ... но я не хотел подавлять новичка. – 2009-04-22 12:45:10

1

Первое правило перегрузки операторов: не перегружайте операторы, которые не имеют смысла. Например, оператор + может выглядеть как хороший выбор для добавления элементов в списки, но это не так: не каждый найдет это логичным.

Относительно математических операторов 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 rvalue.

+0

Не возвращайте константу. – 2010-03-25 07:06:00

0

Все операторы перегружают как функцию-член, принимают * это как lvalue, поэтому вам нужен друг в случаях, когда вы не хотите, чтобы такие операторы перегрузочного потока были < < и >>. В большинстве других случаев использование друзей нарушить принцип наименьших привилегий. Другим способом перегрузки оператора, который не был указан, является использование глобальной функции.

Смежные вопросы