Язык программирования C++ от Страуструпа

Операторные функции


Можно описать функции, определяющие интерпретацию следующих операций:

+    -    *    /    %    ^    &    |    ~    !

=    <    >    +=   -=   *=   /=   %=   ^=   &=

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

||   ++   --   ->*  ,    ->   []   ()   new  delete

Последние пять операций означают: косвенное обращение ($$7.9), индексацию ($$7.7), вызов функции ($$7.8), размещение в свободной памяти и освобождение ($$3.2.6). Нельзя изменить приоритеты этих операций, равно как и синтаксические правила для выражений. Так, нельзя определить унарную операцию % , также как и бинарную операцию !. Нельзя ввести новые лексемы для обозначения операций, но если набор операций вас не устраивает, можно воспользоваться привычным обозначением вызова функции. Поэтому используйте pow(), а не ** . Эти ограничения можно счесть драконовскими, но более свободные правила легко приводят к неоднозначности. Допустим, мы определим операцию ** как возведение в степень, что на первый взгляд кажется очевидной и простой задачей. Но если как следует подумать, то возникают вопросы: должны ли операции ** выполняться слева направо (как в Фортране) или справа налево (как в Алголе)? Как интерпретировать выражение a**p как a*(*p) или как (a)**(p)?

Именем операторной функции является служебное слово operator, за которым идет сама операция, например, operator<<. Операторная функция описывается и вызывается как обычная функция. Использование символа операции является просто краткой формой записи вызова операторной функции:

void f(complex a, complex b)

{

  complex c = a + b;               // краткая форма

  complex d = operator+(a,b);      // явный вызов

}

С учетом приведенного описания типа complex инициализаторы в этом примере являются эквивалентными.



Содержание раздела