Программирование >>  Программирование на языке c++ 

1 ... 70 71 72 [ 73 ] 74 75 76 ... 159


операторы, которые доопределяются функцией operator, являющейся компонентом некоторого класса А. В последнем случае доопределенный оператор можно приложить только к объектам класса А (т. е. один из операндов этого оператора является объектом класса А, более того, согласно правилам языка С++, объект класса А всегда является первым или левым операндом). Поскольку класс А - это тип, то локально доопределенные операторы задают множество операций, которые можно выполнить над объектами типа А, т. е. над объектами типа, определенного пользователем;

операторы =, [ ], (), и -> можно доопределить только с помощью нестатической функции operator, являющейся компонентом класса. Эти операторы нельзя доопределить для объектов типа перечисление - enum;

оператор [ 1 задания индекса для массива рассматривается как бинарный оператор. Пусть а - объект класса А, в котором доопределен оператор [ ]. Тогда, выражение a[i] интерпретируется как a.operator[ ](i). Дополнительные пояснения см. в § 5.6;

оператор () вызова функции рассматривается как бинарный оператор. Пусть а - объект класса А, в котором доопределен оператор (). Тогда выражение а(х1,х2,хЗ,х4) интерпретируется как a.operator()(xl,x2,x3,x4). Дополнительные пояснения даны в § 5.7;

оператор -> доступа к компоненту класса через указатель на объект этого класса рассматривается как унарный оператор. Пусть а - объект класса А, в котором доопределен оператор ->. Тогда выражение а->т интерпретируется как (a.operator->())->m. Это означает, что функция operator->() должна возвращать указатель на класс А, или объект класса А, или ссылку на класс А. Дополнительные пояснения см. в § 5.8;

за исключением доопределения операторов new и delete функция operator должна быть либо нестатическим компонентом-функцией (если это локальная функция), либо иметь как минимум один аргумент (операнд) типа класс или ссылка на класс (если это глобальная функция);



функцию operator можно вызвать по ее имени, например, z=operator*(x,y) или z=x.operator*(y). В первом случае вызывается глобальная функция. Во втором случае вызывается локальная в некотором классе X функция, и X - это объект класса X. Однако чаще всего функция operator вызывается косвенно, например z=x*y;

за исключением оператора присваивания (=), все операторы, доопределенные в классе В, наследуются в любом производном классе D (B<-D);

пусть В - базовый класс, D - производный класс, и B<-D. Тогда локально доопределенный оператор для класса В может быть далее повторно доопределен в классе D;

глобальные операторы new можно доопределить и в общем случае они могут не иметь аргументов (операндов) типа класс . В результате разрешается иметь несколько глобальных операторов new, которые различаются путем изменения числа и(или) типов их аргументов;

глобальные операторы delete не могут быть доопределены;

заданные в самом языке глобальные операторы new и delete можно изменить, т. е. заменить версию, заданную в языке по умолчанию, на свою версию;

локальные функции operator new и operator delete являются статическими компонентами класса, в котором они определены, независимо от того, использовался или нет спецификатор static (это, в частности, означает, что они не могут быть виртуальными функциями);

для правильного выделения и освобождения динамической памяти под базовый и производный объекты во многих задачах следует использовать виртуальный деструктор (см. § 4.7 и 5.9);

единственным оператором, который не наследуется в производных классах, является оператор присваивания (=). Другими словами, функция operator=(), определенная в базовом классе В, не может быть наследована любым его производным классом D (B<-D);

если для класса А оператор = не был переопределен и al, а2 - это объекты класса А, то выражение al=a2 задает



ПО умолчанию присваивание значений компонентов-данных объекта а2 компонентам-данным объекта al;

-ф- однооперандный (унарный) оператор доопределяется с помощью компонента-функции operator без аргументов или глобальной функции operator с одним аргументом;

-ф- доопределение операторов ++ (инкремента) и - (декремента), записываемых после операнда (z++, z~), отличается добавлением в функцию operator фиктивного параметра int, который используется только как признак отличия операторов z++ и z- от операторов ++z и -z (см. § 5.3);

ф- двухоперандный (бинарный) оператор доопределяется с помощью компонента-функции operator с одним аргументом или глобальной функции operator с двумя аргументами. Глобальные функции operator часто объявляются со спецификатором friend по отнощению к некоторому классу;

в языке C-I--I- установлена идентичность некоторых операций, например, ++z - это то же, что и z+=l. Эта идентичность теряется для доопределенных операторов (если она, конечно, не задана при переопределении соответствующих операторов);

доопределенный оператор не может иметь аргументы (операнды), заданные по умолчанию;

4 функция operator вида operator type() без возвращаемого значения, определенная в классе А, задает преобразование типа А к типу type (см. § 5.4).



1 ... 70 71 72 [ 73 ] 74 75 76 ... 159

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика