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

1 ... 56 57 58 [ 59 ] 60 61 62 ... 227


Перегрузка оператора + для операции coord coord::operator+(int i) ;

coord temp; -

temp.x = x+ i;

temp, у = у + i; r---

return temp;

int mainO , , ....

{ \ ,

coor (10, 10) 3), o3; .

int x, y; - ...... i.

o3 1 + o2; сложение даух объектов - -

II вызов функции operator+ (coord) o3.get xy (х, у) ; .i.

cou< (ol + o2) у \n ;

o3 = ol + 100; сложение объекта и целого . , . .

вызов функции operator+(int) . o3.get xy (х, у);

cou< (ol + 100) у \п ; .- . ..-

return 0; ... . . .

Здесь важно запомнить следующее: когда оператор-функция - член класса перегружается так, чтобы объект этого класса можно было использовать в

одной операции с переменной встроенного типа данных, встроенный тип

данных должен находиться справа от оператора. Смысл этого легко понять: он в том, что объект, который находится слева, генерирует вызов оператор-

функции. Однако что произойдет, если компилятор встретит следующую инструкцию?

оЗ = 19 int + ob

Для обработки сложения целого с объектом встроенной операции не существует. Перегруженная функция operator+(iiit i) работает только в том случае, если объект находится слева от оператора. Поэтому эта инструкция приведет к

ошибке при компиляции. (Позже вы узнаете способ обойти это ограничение.)

4. функции можно использовать -ссылку. Например, до-

пустимым способом перегрузки оператора + относительно класса coord является следующий:

Перегрузка + относительно класса coord, с использованием ссылки coord coord: :operator+(coord sob2)



184 . . . Самоучитель C++

coord

temp.x = X + оЬ2.х; temp.у = у + оЬ2.у;

return temp;

Одним из доводов в пользу использования ссылки в качестве параметра оператор-функции является ее эффективность. Передача объекта функции в качестве параметра часто требует больших затрат процессорного времени.

Передача же адреса объекта всегда быстрее и эффективней. Если оператор

многократно используется, параметр-ссылка обычно позволяет значительно повысить производительность.

Другой довод в пользу использования параметра-ссылки состоит в том, что ссылка позволяет избежать неприятностей, связанных с удалением копии операнда. Как вы знаете по предыдущим главам, при передаче аргумента по значению создается его копия, Если у такого объекта есть деструктор, то после завершения выполнения функции вызывается деструктор копии. Иногда возможны ситуации, когда деструктор удаляет нечто такое, что необходимо вызывающему объекту. Использование в этом случае в качестве параметра не самого объекта, а ссылки на этот объект - это простой (и эффективный) способ избежать проблем. Тем не менее, запомните, что в общем случае решить эту проблему могло бы определение конструктора копий.

у. ----Г-;.-7

Упражнения

- -

1. Для класса coord перегрузите операторы * и /. Продемонстрируйте их работу.

2. В приведенном ниже примере некорректно перегружен оператор Почему? coor ator% (coord ob)

double i;

cou << Введите число: ;

cou корень << равен ; . cout sqr(i);

3 Поэкспериментируйте, меняя тип возвращаемого значения оператор-функций на что-нибудь отличное от coord. Обратите внимание на генерируемые компилятором сообщения об ошибках.




В современных компиляторах C++ оператор-функции дл груэки операторов отношения и логических операторов могут возвращать значения булева типа, хотя особого преимущества в этом нет. Как было описано в главе 1, в булевом типе данных определены только два значения - true и false. Эти значения автоматически конвертируются в ненулевое и нулевое значения. И наоборот, целые ненулевое и нулевое значения автоматически конвертируются в значения true и false.

Примеры

1. В следующей программе перегружаются операторы == и &&.

Перегрузка операторов == относительно класса coord #include <iostream> ] . j *.

using namespace std;

class coord {

int x, у; значения координат public: ..

coord О { x = 0; }

coord{int i, int j) { x = i; у = j; } .

voi (int si, in fij) { i = x; j y; }

in tor== (coord ob2) ;

Перегрузка оператора для класса coord

in ator== (coord ob2)

return x= = ob2.x && y==ob2.y;

6.3. Перегрузка операторов отношения и логических операторовв

Существует возможность перегрузки операторов отношения и логических операторов. При перегрузке операторов отношения и логических операторов

так, чтобы они вели себя обычным образом, не нужны оператор-функции,

возвращающие объект класса, для которого эти оператор-функции определены. Вместо этого они должны возвращать целое, интерпретируемое как значение true или false. Помимо того, что возвращаемым значением таких оператор-функций должно быть значение ие или false, должна быть возможность встраивания операторов отношения и логических операторов в большие выражения, включающие также данные других типов.



1 ... 56 57 58 [ 59 ] 60 61 62 ... 227

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