|
Программирование >> Расширенная версия языка c++
ol ol - o2; вычитание ol.get xy(x, y) ; cou ol-o2) x , у \n ; = -ol; отрицание ol.get xy(x, y) ; cou (-Ql) x , у \n ; return 0; Как видите, если минус перегружать как бинарный оператор, то у функции будет один параметр. Если его перегружать как унарный оператор, то параметров не будет. Это отличие в числе параметров и делает возможным перегрузку минуса для обоих операторов. Как показано в программе, при использовании минуса в качестве бинарного оператора вызывается функция Operator-(coord оЪ2), а в качестве унарного - функция operator-(). 1. Перегрузите оператор - относительно класса coord. Создайте его префиксную и постфиксную формы. 2. Перегрузите оператор + относительно класса coord чтобы он был как бинарным (как было показано ранее), так и унарным оператором. При использовании в качестве унарного оператор + должен делать положительным значение любой отрицательной координаты. 6.5. Дружественные оператор-функции Как отмечалось в начале этой главы, имеется возможность перегружать оператор относительно класса, используя не только функцию-член, но и дружественную функцию. Как вы знаете, дружественной функции указатель this не передается. В случае бинарного оператора это означает, что дружественной оператор-функции явно передаются оба операнда, а в случае унарного - один. Все остальное в обоих случаях одинаково, и нет особого смысла вместо оператор-функции - члена класса использовать дружественную return *thi3; int main () coord о1(10, 10), o2(5, 7); int x, у; , ;t оператор-функцию, за одним важным исключением, которое будет рассмотрено в примерах. Нельзя ьэовать дружественную функцию для перегрузки оператора присваивания. Оператор присваивания можно перегружать только как оператор-функцию - член класса. - г, 1. Здесь функция operator+() перегружается для класса coord с использованием дружественной функции: Перегрузка оператора + относительно класса coord с использованием дружественной функции . #include <iostream> ., / using namespace std; .. - . i , - class coord { : . , int у; значения координат public: - . - - -. - . - . coord f) { x = y= 0; } . . coord (int i, int j) { X = i; у = j; } void get xy(int Si, int &j) { i - x; j = y; } friend coord operator+(coord оЫ, coord ob2); / / Перегрузка оператора + с использованием дружественной функции coord coord ob2) coord terep.x l.x + ob2.x; - temp.у l.y + оЬ2,у; return temp; II .О , int main() ( coord ol(10, 10), o2(5, 3), o3; int X, y; o3 = ol o2; сложение двух объектов вызов функции operator+{) Обратите внимание, что левый операнд передается первому параметру, а правый - второму. 2. Перегрузка оператора посредством дружественное кции дает одну очень важную возможность, которой нет у функции - члена класса. Используя дружественную в операциях с объектами можно исполь- зовать встроенные типы данных, и при этом встроенный тип может располагаться слева от оператора. Как отмечалось ранее в этой главе, можно перегрузить оператор-функцию, являющуюся членом класса, так, что левый операнд становится объектом, а правый - значением встроенного типа. Но нельзя для функции - члена класса располагать значение встроенного типа слева от оператора. Например, пусть перегружается оператор-функция - член класса, тогда первая показанная здесь инструкция правильна, а вторая нет: оЫ = оЬ2 + 10; правильно оЫ = 10 неправильно Несмотря на то, что допустимо строить выражения так, как показано в первом примере, необходимость постоянно думать о том, чтобы объект находился слева от оператора, а значение встроенного типа - справа, может быть обременительной. Решение проблемы состоит в том, чтобы сделать перегруженную оператор- функцию дружественной и задать обе возможные ситуации. Как вы знаете, дружественное -функции передаются явно оба операнда. Таким образом, можно задать перегружаемую дружественную функцию так, чтобы левый операнд был объектом, а правый - операндом другого типа. Затем можно снова перегрузить оператор, чтобы левый операнд был значением встроенного типа, а правый - объектом. Следующая программа иллюстрирует такой подход: оператор-функции придают гибкость программе ,-: ttinclude <iostream> using namespace class coord { . int х, у; значения координат ..) ,. public: coord() { x 0; 0; } coord(int i, int j) { X = i; у = j; } sfi void get xy(int £i, int &j) { i = x; j = y; } . . friend coord operator+(coord obi, int i) ; . i........ friend coord operator+(int i, coord obi); - - o3.get xy(x, у) ; - cout (ol + о2) х , у Vn ; return 0;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |