Бьерн Страуструп - Язык программирования С++. Главы 5-7 - Операторные функции

ОГЛАВЛЕНИЕ


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

Можно описать функции, определяющие интерпретацию следующих операций:
      +    -    *    /    %    ^    &    |    ~    !
      =    <    >    +=   -=   *=   /=   %=   ^=   &=
      |=   <<   >>   >>=  <<=  ==   !=   <=   >=   &&
      ||   ++   --   ->*  ,    ->   []   ()   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 инициализаторы в этом примере являются эквивалентными.