Перегрузка операторов с не-членами функций

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

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

Другие вопросы по тегам