Функция-оператор (операторная функция, функциональная операция) может быть определена как внутри описания класса, так и вне его. Различают два вида операторных функций:
- простую (определяется вне класса, может быть одноместной или двухместной)
- компонентную (определяется в классе. У нее первый аргумент представляет собой объект класса, заданный неявно. Она может быть одноместной – не имеет явных аргументов, либо двухместной – с одним аргументом)
Таблица 1    
Простая функцияКомпонентная функция
Одноместная: <тип результата> operator@( <аргумент> )Одноместная: <тип результата> operator@()
Двухместная: <тип результата> operator@( <аргумент 1>, <аргумент 2> )Двухместная: <тип результата> operator@( <аргумент 1>, <аргумент 2> )

<тип результата> - тип возвращаемого значения (имеет тот же тип, что и класс, но возможен и иной тип значения).

Следует помнить, что нельзя перегружать следующие операторы: . :: .* ? sizeof и операторы препроцессора # и ##

Перегрузка операций подчинена следующим правилам:
  1. при перегрузке операций сохраняется количество аргументов, приоритеты операций и правила ассоциации, используемые в стандартных типах данных
  2. для стандартных типов данных переопределить операции нельзя
  3. функциональные операции не могут иметь аргументов по умолчанию
  4. функциональные операции наследуются (кроме операции присваивания =)
  5. функциональные операции не могут определяться как static

Функциональную операцию можно определить тремя способами:
  1. как метод класса
  2. как дружественную функцию
  3. как обычную функцию

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

Формы вызова операторной функции:
Таблица 2    
Стандартная формаОператорная форма
Простая функция: operator@( <аргумент> )Простая функция: @( <аргумент> )
operator@( <аргумент 1>, <аргумент 2>)<аргумент1>@ <аргумент2>
Компонентная функция: <аргумент>.operator@()Компонентная функция: @( <аргумент> )
<аргумент1>.operator@( <аргумент2> )<аргумент1>@ <аргумент2>