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



7.2.1 Бинарные и унарные операции

 Бинарную операцию можно определить как функцию-член с одним
 параметром, или как глобальную функцию с двумя параметрами. Значит,
 для любой бинарной операции @ выражение aa @ bb интерпретируется
 либо как aa.operator(bb), либо как operator@(aa,bb). Если определены обе
 функции, то выбор интерпретации происходит по правилам сопоставления
 параметров ($$R.13.2). Префиксная или постфиксная унарная операция
 может определяться как функция-член без параметров, или как глобальная
 функция с одними параметром. Для любой префиксной унарной операции
 @ выражение @aa интерпретируется либо как aa.operator@(), либо как
 operator@(aa). Если определены обе функции, то выбор интерпретации
 происходит по правилам сопоставления параметров ($$R.13.2). Для
 любой постфиксной унарной операции @ выражение @aa интерпретируется
 либо как aa.operator@(int), либо как operator@(aa,int). Подробно
 это объясняется в $$7.10. Если определены обе функции, то выбор
 интерпретации происходит по правилам сопоставления параметров
 ($$13.2). Операцию можно определить только в соответствии с
 синтаксическими правилами, имеющимися для нее в грамматике С++.
 В частности, нельзя определить % как унарную операцию, а + как
 тернарную. Проиллюстрируем сказанное примерами:

         class X {
           // члены (неявно используется указатель `this'):

           X* operator&();        // префиксная унарная операция &
                                  // (взятие адреса)
           X operator&(X);        // бинарная операция & (И поразрядное)
           X operator++(int);     // постфиксный инкремент
           X operator&(X,X);      // ошибка: & не может быть тернарной
           X operator/();         // ошибка: / не может быть унарной
         };

        // глобальные функции (обычно друзья)

         X operator-(X);          // префиксный унарный минус
         X operator-(X,X);        // бинарный минус
         X operator--(X&,int);    // постфиксный инкремент
         X operator-();           // ошибка: нет операнда
         X operator-(X,X,X);      // ошибка: тернарная операция
         X operator%(X);          // ошибка: унарная операция %

 Операция [] описывается в $$7.7, операция () в $$7.8, операция ->
 в $$7.9, а операции ++ и -- в $$7.10.

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