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