Перегрузка операторов функциями, не являющимися членами

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


person rubixibuc    schedule 23.04.2011    source источник


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

person Etienne de Martel    schedule 23.04.2011
comment
Я предполагаю, что std — это пространство имен, а не класс, поэтому ostream — это функция freestadning в пространстве имен std? Таким образом, разница между функцией-членом и автономной функцией в этом случае заключается в том, как она взаимодействует со своими операндами? - person rubixibuc; 23.04.2011
comment
Нет, имя функции operator<<. std::ostream & — тип возвращаемого значения. Но в конечном итоге разница в том, что один является методом (и, следовательно, имеет указатель this), а другой — нет. - person Etienne de Martel; 23.04.2011
comment
Я прошу спросить, что в данном случае представляет собой std::ostream, я знаю, что это возвращаемый тип, а std — это пространство имен, но что такое ostream? И как это вписывается в пространство имен? - person rubixibuc; 23.04.2011
comment
std::ostream — это базовый класс для всех выходных потоков. std::cout это std::ostream. - person Etienne de Martel; 23.04.2011
comment
Подождите, является ли ostream классом, определяемым в пространстве имен std? - person rubixibuc; 23.04.2011