|
Программирование >> Программирование на языке c++
операторы, которые доопределяются функцией 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).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |