Ответ на этот вопрос, кажется, ускользает от меня, но как вы относитесь к перегрузке функциями, не являющимися членами. Вы просто создаете функцию уровня программы, и везде, где существует прототип (или определение), оператор перегружается для этого типа класса?
Перегрузка операторов функциями, не являющимися членами
Ответы (1)
В функции-члене this
будет левым параметром, что означает, что ваш оператор будет иметь только один аргумент (или ни одного для унарных операторов). Для автономной функции вы должны предоставить либо два, либо один аргумент для бинарных или унарных операторов соответственно.
Хорошим примером является оператор <<
для потоков:
class T;
// ...
std::ostream & operator<<(std::ostream &os, const T &val)
{
// ...
return os;
}
Здесь os
— левый параметр, а val
— правый.
Что касается «где», оператор должен быть определен, где вы его используете. Как правило, размещайте их в том же месте, что и тип, для которого вы перегружаете операторы.
ИЗМЕНИТЬ:
Для нетривиальных операторов (арифметических операций над примитивными типами) операторы являются синтаксическим сахаром для вызовов функций. Когда вы делаете это:
std::cout << "Hello";
Это как написать, что:
operator<<(std::cout, "Hello");
Но более читабельно.
Для операторов-членов левым параметром будет this
(поэтому у операторов-членов на один аргумент меньше).
operator<<
. std::ostream &
— тип возвращаемого значения. Но в конечном итоге разница в том, что один является методом (и, следовательно, имеет указатель this
), а другой — нет.
- person Etienne de Martel; 23.04.2011
std::ostream
— это базовый класс для всех выходных потоков. std::cout
это std::ostream
.
- person Etienne de Martel; 23.04.2011