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. Далее вы хотите определить функцию-член для увеличения даты на несколько дней: