Перегрузка операторов с не-членами функций - PullRequest
1 голос
/ 23 апреля 2011

Ответ на этот вопрос, кажется, ускользает от меня, но как вы справляетесь с перегрузкой функциями, не являющимися членами?Вы просто создаете функцию уровня программы, и там, где существует прототип (или определение), оператор перегружается для этого типа класса?

1 Ответ

3 голосов
/ 23 апреля 2011

При использовании функции-члена 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 (и поэтому операторы-члены имеют на один аргумент меньше).

...