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



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 инициализаторы в этом
 примере являются эквивалентными.

 
« Предыдущая статья   Следующая статья »