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

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


complex(double re, double im) { complex::re=re;

complex::im=im;} friend complex operator+(complex,complex); friend complex operator*(complex,complex);

complex operator+(complex a, complex b) { return comp!ex(a.re+b.re,a.im+b.im); } complex operator*(complex a, complex b) { return complex(a.re*b.re,a.im*b.im); }

Здесь новые значения операторов + и * определяются с помощью специальных функций с именами operator+ и operator*. Предположим, заданы два объекта а и b класса complex (т. е. заданы два комплексных числа). Если мы хотим сложить а и Ь, надо выполнить функцию

operator+(a,b);

Рассмотрим пример;

void main{void)

{ complex a(1,2.6),b(1.3,2),c(1,2);

с = operator+(a,b);

с = operator+(b,operator*(a,c)); }

По соглашению, принятому в языке С++, выражения типа:

operator+(a,b);

operator*(a,c);

можно записать также в сокращенном виде:

а+Ь;

а*с;

В результате программа примет привычный вид: void main(void)

{ complex a(1,2.6),b(1.3,2),c(1,2); с = a + b; с = b + a * с; }

Определенный ранее в языке С++ приоритет выполнения операций сложения (+) и умножения (*) здесь сохраняется. По-



этому в последнем выражении в программе сначала выполняется умножение (а*с), а потом сложение полученного результата со значением Ь.

5.2. Функция operator

Функция operator может быть использована, для расширения области приложения следующих операторов:

+ - * / % & I ~ ! = < > += -= *=

>= && II ++ ~ ->* , -> D О new delete Эта функция не может изменить приоритеты операций и определенное в самом языке число операндов для операции. Например, нельзя изменить оператор деления /, который должен быть приложен к двум операндам, на новый оператор /, который прилагается к одному операнду. Другими словами, бинарные (двухоперандные) операторы должны оставаться бинарными, а унарные (однооперандные) - унарными.

Функция operator используется для расширения области приложения оператора # в следующей форме:

operator*

Здесь # может иметь одно из значений, перечисленных в начале параграфа. Объявление и вызов функции operator осуществляется так же, как и любой другой функции. Единственное ее отличие заключается в том, что разрешается использовать сокращенную форму ее вызова. Так, выражение operator#(a,b) можно записать в сокращенной форме: а#Ь.

Рассмотрим примеры. Первая программа доопределяет значение оператора &. В результате его можно использовать для выполнения операции объединения множеств.

#include <iostream.h>

class set { класс множество

char *i; I - указатель на множество символов

public:

set(char *1) : i(l) {} это конструктор

char* operator&(set); объявление функции operator

char* set::operator&(set S) описание функции operator

(ниже находится пересечение двух множеств)



функция operator

{ int t=0,l=0; while(i[t++]!=0); char *s = new char[t]; for(int j=0;i[j]!=0;j++)

for{int l=0;S.i[l]!=0;l++)

if (i[j]==S.i[l]) { s[l]=i[j]; !++; breal; }

s[l]=0; return s;

void main(void)

{ set S1= 1f2bg5e6 ,S2= abcdef ; задаются два множества cout (S1 & S2) endl; Результат: fbe cout (set{ 123 ) & set( 426 )) endl; Результат: 2

В приведенной программе основное внимание уделено демонстрации функции operator&. Здесь не выполняется проверка правильности задаваемых множеств, например наличия в множестве повторяющихся символов. В примере функция operator& является компонентом класса. Поэтому она содержит указатель this и может обращаться к другим компонентам этого класса по их именам (без использования операторов . и ->). Более подробное пояснение различных способов задания функции operator дано в § 5.3.

Вторая программа показывает доопределение оператора *, после чего его можно использовать для умножения комплексных чисел. Здесь же выполняется доопределение оператора вывода для того, чтобы упростить вывод комплексного числа на экран дисплея.

#include <iostream.h>

class complex { класс комплексное число

double re,im; вещественная (re) и мнимая части (im) public:

complex(double RE,double IM) ; re(RE), im(IM) {}

доопределение оператора * friend complex operator*{complex a,complex b)

{ return complex(a.re*b.re,a.im*b.im); }

доопределение оператора



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

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