|
|
Перегружать можно большинство операций.
имя-функции-оператор:
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.
| |