|
Программирование >> Расширенная версия языка c++
192 Самоучитель C+ + Перегрузка оператора + дл ации ob + int coord operator+(coord оЫ, int i) coord temp; temp.x l.x + i; temp, у 1. у + i; , t. ..> .. и return temp; Перегрузка оператора + для операции int coord operator+(int i, coord obi) coord temp; temp.x = obl.x + i; = + i; return temp; int mainO coor (10, 10) ; int x, y; ol = ol ; объект + целое .get xy(x, у) ; cou< (ol 10) x , у \n ; ol = 99 + ol; целое + объект ol.get xy (X, у) ; cou (99 + ol) , у \n ; return 0; В результате перегрузки дружественна! p-функций становятся правильными обе инструкции: ol = ol + 10; . , ol = 99 + ol; 3. При использовании дружественной оператор-функции для перегрузки унарного оператора ++ или - необходимо передавать операнд в функцию в качестве параметра-ссьшки, поскольку дружественной функции не передается указатель this. Запомните, что в операторах инкремента и декремента подразумевается, что операнд будет изменен. Однако при перегрузке этих операторов посредством дружественных функций операнд передается по значению. Таким образом, любое изменение параметра внутри дружественной оператор-функции не влияет на объект, являющийся источником вызова. Поскольку при ис- Глава е. Введение в перегрузку операторов 193 пользовании дружественной функции отсутствует явно передаваемый указатель на объект (т. е. указатель this), инкремент и декремент не влияют на операнд. Однако при передаче операнда дружественной функции в качестве параметра-ссылки, изменения, которые имеют место внутри дружественной функции, влияют на объект, являющийся источником вызова. Например, в следующей программе посредством дружественной функции перегружается оператор ++. Перегрузка оператора ++ с использованием дружественной функции include <iostreain> using namespace std; class coord { in X, у; ения координат public: coord О ( X = 0; y= 0; } . . I coord (int i, int j) { X = i; у = j; } * void get xy(int 4i, int 4j) { i = x; j = y; } ... friend coord operator++ (coordiob) ; . , Перегрузка оператора ++ Овакием дружественной функции coor tor++ (coord Sob) использование ссхлки в качестве параметра ( ob.x++; ; ob.y+1-; return о!.1/ возвращение объекта, ставшего источником вызова - int ma in () coord ol(10, 10) ; in X, y; ++ol; объект ol передается по ссылке ol.get xy{x, у) ; cout {++ol) x , у \n ; return 0; Если вы используете современный компилятор, то с помощью дружественной оператор-функции можно определить разницу между префиксной и постфиксной формами операторов инкремента и декремента точно так же, как это делалось с помощью функций-членов. Просто добавьте целый параметр при задании постфиксной версии. Например, здесь приводятся пре- фиксная и постфиксная версии оператора инкремента относительно класса coord: : coord operator++ (coord sob); префиксная версия , coor ++(coord Sob tused) ; постфиксная версия Если оператор +-f находится перед операндом, то вызывается функция coord operator++(coord &ob). Однако, если оператор ++ находится после операнда, вызывается функция coord operator++(coord &ob, int notused). В этом случае переменной notused будет передано значение 0. 1. Перегрузите операторы - и / для класса coord посредством дружественных функций. 2. Перепишите класс coord так, чтобы можно было использовать объекты типа coord для умножения каждой из координат на целое. Должны быть корректными обе следующие инструкции: ob * int и int * ob. 3. Объясните, почему решение упражнения 2 требует использования дружественных оператор-функций. Покажите, как с помощью дружественной перегрузить опе- ратор- относительно класса coord. Определите как префиксную, так и постфиксную формы. 6.6. Особенности использования оператора присваивания Как уже отмечалось, относительно класса можно перегрузить оператор присваивания. По умолчанию, если оператор присваивания применяется к объекту, то происходит поразрядное копирование объекта, стоящего справа от оператора, в объект, стоящий слева от оператора. Если это то, что вам нужно, нет смысла создавать собственную функцию operator=(). Однако бывают случаи, когда точное поразрядное копирование нежелательно. В главе 3 при выделении памяти объекту вам было представлено несколько примеров подобного рода. В таких случаях требуется особая операция присваивания. Примеры 1. Здесь приведена новая версия класса уре, различные формы которого изучались в предыдущих главах. В этой версии оператор = перегружается так, что указатель р при присваивании не перезаписывается.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |