|
Программирование >> Расширенная версия языка c++
Перегрузка оператора + для операции 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, должна быть возможность встраивания операторов отношения и логических операторов в большие выражения, включающие также данные других типов.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |