R Справочное руководство по С++

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.


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.