logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.13.4 Перегруженные операции

Перегружать можно большинство операций.

имя-функции-оператор:

operator операция

операция: один из

new delete

+ - * / % ^ & | ~

! = < > += -= *= /= %=

^= &= |= << >> >>= <<= == !=

<= >= && || ++ -- , ->* ->

() []

Две последние операции - это вызов функции ($$R.5.2.2) и индексация

($$R.5.2.1).

Можно перегружать следующие (как бинарные, так и унарные)

операции:

+ - * &

Нельзя перегружать следующие операции:

. .* :: ?: sizeof

а также и специальные символы препроцессора # и ## ($$R.16).

Обычно функции, задающие операции (функция-оператор) не вызываются

явно, к ним обращаются для выполнения операций ($$R.13.4.1, $$R.13.4.2).

Однако, к ним можно обращаться явно, например:

complex z = a.operator+(b); // complex z = a+b

void* p = operator new(sizeof(int)*n);

Операции new и delete описаны в $$R.5.3.3 и $$R.5.3.4 и к ним

не относятся перечисляемые ниже правила.

Функция-оператор может быть функцией-членом или иметь по крайней

мере один параметр типа класс или ссылка на класс. Нельзя изменить

приоритет, порядок выполнения или число операндов операции, но

можно изменить предопределенное назначение таких операций: =,

унарная & и ,(запятой), если они применяются к объекту типа класс.

За исключением функции operator=(), функция-оператор наследуется.

Правила для operator=() даны в $$R.12.8.

Эквивалентность некоторых операций над основными типами

(например, ++a эквивалентно a+=1) может не сохраняться для таких

же операций над классами. Для некоторых операций требуется, чтобы

в случае использования основных типов операнд был адресом (например,

для +=). Это требование может быть снято, если операция задана над

классами.

Перегруженная операция не может иметь стандартные значения

параметров ($$R.8.2.6).

Операции, которые явно не указаны в $$R.13.4.3-$$R.13.4.7,

действуют как обычные унарные или бинарные операции, подчиняющиеся

правилам, приведенным в $$R.13.4.1 или $$R.13.4.2.