|
Программирование >> Программирование на языке c++
friend ostreamfii operator (ostream& stream.complex С) { stream C.re \t C.im endl; return stream; } void main(void) { complex x(2,3),y(4,5); объявление двух комплексных чисел cout X у << х*у; вариант 1 вариант 2 operator ( operator ( operator {cout,x),y ),х*у ); cout=operator (cout,x); вариант 3 cout=operator (cout,y); вариант 3 cout=operator<<(cout,x*y); вариант 3 В результате выполнения программы три раза будут выведены следующие результаты: 2 3 4 5 8 15 Фрагменты программы, помеченные как вариант 1, вариант 2 и вариант 3, полностью идентичны и используют только разные формы вызова функции operator . 5.3. Доопределение бинарных и унарных операторов Функция operator для доопределения бинарных операторов может быть описана двумя способами: 4- как компонент-функция класса с одним аргументом; как глобальная функция (функция, описанная вне класса) с двумя аргументами. Таким образом, для любого бинарного оператора # выражение а#Ь может быть представлено или как a.operator#(b), если используется первый способ, или как operator#(a,b), если используется второй способ. Унарный оператор (используемый в виде префикса или суффикса) тоже можно описать двумя способами: как компонент-функцию без аргументов; -ф- как глобальную функцию с одним аргументом. Для любого унарного оператора #, используемого в виде префикса, выражение #а может быть представлено или как a.operator#(), если используется первый способ, или как operator#(a), если используется второй способ. Для любого унарного оператора #, используемого в виде суффикса, выражение а# может быть представлено или как a.operator#(int), если используется первый способ, или как operator#(a,int), если используется второй способ. При этом аргумент типа int на самом деле не существует, а такая форма записи вводится лишь для того, чтобы отличить унарный оператор, записанный перед операндом (префикс), от унарного оператора, записанного после операнда (суффикс). Так, например, отличаются операции ++а и ~Ь от операций а++ и Ь-. Если рассматриваются глобальные версии функций operator, то в большинстве случаев эти функции будут объявляться в соответствующих классах со спецификатором friend. Рассмотрим некоторые другие правила, которые принимаются во внимание при определении функции operator. Четыре функции: operator=, operatorU, operatorO и operator-> должны быть нестатическими компонентами-функциями класса. Функция operator должна быть либо компонентом класса, либо иметь хотя бы один аргумент типа объект класса (исключение из этого правила сделано лишь для операторов new и delete). Рассмотренное правило гарантирует, что новое значение оператора будет иметь силу лишь для типов данных, определенных пользователем, а в других выражениях, операнды которых имеют стандартные (определенные в самом языке) типы, значение доопределенного оператора будет прежним. В результате язык С++ имеет лишь средства, которые позволяют расширять язык, но не изменять его. Функция operator, у которой первый операнд имеет стандартный (определенный ранее в самом языке) тип данных, не может быть компонентом-функцией класса. Действительно, пусть необходимо вычислить значение выражения а+3, где а- объект комплексного типа (типа complex). Оно может быть представлено как a.operator+(3). Однако выражение 3+а не может быть представлено в аналогичном виде, т. е. 3.operator+(a). Подобные задачи можно решить с помощью глобальньпс функций operator. Рассмотрим примеры. Первая программа показывает доопределение оператора +, после чего его можно использовать для суммирования окружностей. Договоримся понимать под суммой двух окружностей новую окружность, радиус которой равен сумме радиусов суммируемых окружностей. #include <iostream.h> #include <graphics.h> #include <conio.h> для функции getchQ class circle { static int x,y; координаты общего центра всех окружностей int radius; радиус окружности public: circle (int г) : radius(r) {} конструктор окружности friend void operator+(circle c1,circle c2) функция operator здесь вызывается глобальная (библиотечная) функция circle { ::circle(circle ::x,circle ::y,c1.radius-l-c2.radius); } int circle ::x=300; инициализация статических переменных int circle ::y=100; void main(void) { int gd=DETECT,gm; initgraph(&gd, &gm, ); инициализация графики circle C1(30),C2(50); конструирование двух окружностей C1+C1; на экране вычерчивается окружность с радиусом C1.radius+C1.radius С1+С2; здесь радиус будет C1.radius-I-C2.radius getchO; приостановка до нажатия любой клавиши closegraphO;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |