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

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


Бинарную операцию можно определить как функцию-член с одним параметром, или как глобальную функцию с двумя параметрами. Значит, для любой бинарной операции @ выражение 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.



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