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