Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КРАТКИЙ ОБЗОР С.doc
Скачиваний:
1
Добавлен:
26.10.2018
Размер:
2.11 Mб
Скачать

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.

7.2.2 Предопределенные свойства операций

      Используется только несколько предположений о свойствах пользовательских       операций. В частности, operator=, operator[], operator() и       operator-> должны быть нестатическими функциями-членами. Этим       обеспечивается то, что первый операнд этих операций является адресом.       Для некоторых встроенных операций их интерпретация определяется       как комбинация других операций, выполняемых над теми же операндами.       Так, если a типа int, то ++a означает a+=1, что в свою очередь       означает a=a+1. Такие соотношения не сохраняются для пользовательских       операций, если только пользователь специально не определил их с такой       целью. Так, определение operator+=() для типа complex нельзя вывести       из определений complex::operator+() и complex operator=().       По исторической случайности оказалось, что операции = (присваивание),       &(взятие адреса) и , (операция запятая) обладают предопределенными       свойствами для объектов классов. Но можно закрыть от произвольного       пользователя эти свойства, если описать эти операции как частные:       class X {       // ...       private:       void operator=(const X&);       void operator&();       void operator,(const X&);       // ...       };       void f(X a, X b)       {       a= b; // ошибка: операция = частная       &a; // ошибка: операция & частная       a,b // ошибка: операция , частная       }       С другой стороны, можно наоборот придать с помощью соответствующих       определений этим операциям иное значение.