Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ Страуструп.doc
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
2.72 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 // ошибка: операция , частная

}

С другой стороны, можно наоборот придать с помощью соответствующих

определений этим операциям иное значение.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]