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

1 ... 58 59 60 [ 61 ] 62 63 64 ... 227


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;



1 ... 58 59 60 [ 61 ] 62 63 64 ... 227

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