class X
{
public : // ...
friend int operator>( const X&, const Y&) ;
};
Функция operator> объявлена в классе х как дружественная. Эта функция двухместная и не является членом класса, так что в скобках будут передаваться два аргумента.
class Y.
. { ' public: // ....
Y& operator+=( const Y&);
) ;
Функция operator+= объявлена в классе Y как функция-член. Так как она бинарная, значит должно быть два объекта. Один, естественно, передается как аргумент; обращение ко второму осуществляется через указатель this. Объявление операции += как функции-члена подразумевает, что объект у должен быть слева:
Y у += г; // Здесь z является или может быть объектом типа Y
Развернем этот пример: логически он эквивалентен
Y y.operator+=(z) ;
Компилятор выдаст предупреждение, если вы укажете неправильное количество аргументов. Запомните несколько советов:
• Число объектов должно соответствовать порядку операции.
• Для функций-членов один объект доступен через указатель this.
• Для не членов класса количество аргументов должно соответствовать порядку операции: 1 для унарных, 2 для бинарных.
• Перегруженные оператор-функции могут быть членами класса, глобальными друзьями класса, или глобальными не членами и не друзьями. В последнем случае оператор-функция должна иметь доступ к нужным данным класса, для чего либо эти данные-члены должны быть открытыми (public), либо в классе должна быть определена оператор-функция преобразования.
Совет
Совершенно не обязательно использовать перегрузку операций. Для многих программистов C++ остается просто улучшенным С. Как вариант, для манипулирования новыми типами объектов можно создавать обычные функции. Например, вы определили класс DATE. Далее вы хотите определить функцию-член для увеличения даты на несколько дней: