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