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

1 ... 59 60 61 [ 62 ] 63 64 65 ... 159


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;



1 ... 59 60 61 [ 62 ] 63 64 65 ... 159

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