Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Class dek_koord




{ int x,y; // декартовы координаты точки

public:

dek_koord(){};

dek_koord(int X,int Y): x(X),y(Y) {}

dek_koord operator*(const dek_koord);

dek_koord operator=(const dek_koord);

dek_koord operator>(const dek_koord);

int operator ==(const dek_koord);

void see();

};

dek_koord dek_koord::operator*(dek_koord a) // перегрузка операции *

{ dek_koord tmp; // локальный объект

tmp.x=x*a.x;

tmp.y= y*a.y;

return tmp;

}

dek_koord dek_koord::operator =(const dek_koord a)

{ x=a.x; // перегрузка операции =

y=a.y;

return *this;

}

dek_koord dek_koord::operator >(const dek_koord a)

{ if (x<a.x) x=a.x; // перегрузка операции >

if (y<a.y) y=a.y;

return *this;

}

int dek_koord::operator ==(const dek_koord a) // перегрузка операции ==

{ if (x==a.x && y==a.y) return 0; // 0 – координаты равны

if (x>a.x && y>a.y) return 1; //

if (x<a.x && y<a.y) return -1; //

else return 2; // неопределенность

}

void dek_koord::see() // функция просмотра содержимого объекта

{ cout << "координата х = " << x << endl;

cout << "координата y = " << y << endl;

}

int main()

{ dek_koord A(1,2), B(3,4), C;

int i;

A.see();

B.see();

C=A*B; // вначале перегрузка операции * затем =

C.see();

C=A>B; // компоненты объекта С принимают значение max от А и В

C.see();

i=A==B; // i получает значение сравнения A==B (−1,0,1,2….)

// cout << A==B << endl; // ошибка

// error binary '<<': no operator defined which takes a right-hand operand

// of type 'class dek_koord' (or there is no acceptable conversion)

cout << (A==B) << endl; // верно

}

Результат работы программы:

координата х = 1

координата y = 2

координата х = 3

координата y = 4

координата х = 3

координата y = 8

координата х = 3

координата y = 4

В приведенной выше программе функцию перегрузки оператора * можно изменить, например, следующим образом:

dek_koord &dek_koord::operator*(const dek_koord &a)

{ x*=a.x;

y*=a.y;

return *this;

}

В этом примере функция operator* в качестве параметра получает ссылку на объект, стоящий в правой части выражения А*В, т.е. на В. Ссылка – это второе имя (псевдоним) для одного и того же объекта. Более подробно ссылки будут рассмотрены ниже. Функция operator* при вызове получает скрытый указатель на объект А и модифицирует неявные параметры (компоненты-данные объекта А – х и у). Возвращается значение по адресу this, т.е. объект А. Возвращать ссылку на объект необходимо для реализации выражения вида A*B*C.

Следует отметить, что если в описании класса dek_koord присутствуют объявления двух функций перегрузки операции *:

class dek_koord

{...

dek_koord operator*(const dek_koord);

dek_koord &operator*(const dek_koord &);

...

};

то возникает ошибка. Аналогично ошибка будет, если одна из функций является компонентой класса, а другая − глобальной функцией.

Если возвращаемое значение функции operator является ссылкой, то в этом случае возвращаемое значение не может быть автоматической или статической локальной переменной.

Рассмотрим фрагмент программы, в которой функция operator* является глобальной.





Поделиться с друзьями:


Дата добавления: 2015-09-20; Мы поможем в написании ваших работ!; просмотров: 823 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Не будет большим злом, если студент впадет в заблуждение; если же ошибаются великие умы, мир дорого оплачивает их ошибки. © Никола Тесла
==> читать все изречения...

2541 - | 2236 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.011 с.