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

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


лра]кне11ш

1. Относительно класса coord перегрузите операторы отношения < и >.

6.4. Перегрузка унарных операторов

Перегрузка унарных операторов аналогична перегрузке бинарных, за исключением того, что мы имеем дело не с двумя, а с одним операндом. При перегрузке унарного оператора с использованием функции-члена у функции нет параметров. Поскольку имеется только один операнд, он и генерирует вызов оператор-функции. Другие параметры не нужны.

Прим!

1. В следующей программе относительно класса coord перегружается оператор инкремента (++):

Перегрузка оператора ++ относительно класса coord #include <iostream> using namespace std;

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

int coord: : operators.S (coord ob2 )

return (x ob2.x) S& (y SS оЬ2.у);

coord ol(10, 10), o2{5, 3), o3(10, 10), o4 (0, 0);

if(ol==o2 ol равно o2\n ; *

else cou << ol не равно o2\n ;

if(ol==o3) couu:, ol равно o3\n ; . , .

else cou:.-.: ol не равно o3\n ;

if(ol5So2) cou o Sfi o2 равно истинаХп ; -.-у

else cout << ol i;f. o2 равно ложь\п ; . :.. ...

if(oliio4) cou << o &4 o4 равно истина\n ;

else cout ol SS o4 равно ложь\п ;

return 0;



Перегрузка оператора + для класса coord coord coord: :operator++() {

y++f - .

return *this; .. . . i ,

int mainO / .

coor (10, 10) ; int x, y;

++ol; инкремент объекта ol.get xy(x, у) ;

cout (++ol) X: X , Y: у \n ; return 0;

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

о2 = ++о1;

Как и в случае бинарных операторов, нет правила, которое заставляло бы перегружать унарный оператор с сохранением его обычного смысла. Однако в большинстве случаев лучше поступать именно так.

2. В ранних версиях при перегрузке оператора инкремента или декремента положения операторов ++ и - относительно операнда не различались. Поэтому по отношению к предыдущей программе следующие две инструкции эквивалентны:

о1++; ++о1;

Однако в современной спецификации C++ определен по которому

компилятор может различить эти две инструкции. В соответствии с этим

class coord { .,. , : . ,

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

public:

coord () { х = 0; у = 0; }

coord {int i, int j) { X = i; у = j; }

void get xy{int Si, int Sj) { i = x; j = y; }

coord opeEator++0 ;

};



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

способом задаются две версии функции ог++(). Первая определяется так, как б1ло показано в предыдущем примере. Вторая определяется следующим образом:

coord coord::operator++(int notused);

Если оператор ++ указан пере андом, вызывается функция operator++(). Если оператор ++ указан после операнда, вызывается функция operator++ (int notused). В этом случае переменной notused передается значение 0. Таким образом, если префиксный и постфиксный инкремент или декремент важны для объектов вашего класса, то понадобится реализовать обе

оператор - функции.

3. Как мете, знак минус в C++ является как бинарным, так и унарным оператором. Вы, наверное, хотели бы знать, как его можно перегрузить относительно создаваемого вами класса так, чтобы оператор сохранил оба эти качества. Реальное решение достаточно элементарно: просто перегрузите его дважды, один раз как бинарный оператор, а второй - как унарный. Программа, реализующая этот прием, показана ниже:

Перегрузка оператора - относительно класса coord .;

♦incjLuue 4io3treaia> .5.

using namespace std;

class coord {

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

coord О { X = 0; y= 0; }

coord(int i, int j) { X = i; у = j; }

void get xy{int Si, int &j ) { i = x; j = y; } . ..

coord operator- (coord ob2) ; бинарный минус

coor or- () ; унарный минус - . ...

Перегрузка оператора - относительно класса coord coord coord: : operator- (coordоЬ2)

coord temp; ..

temp.x = x - ob2.x; temp, у = у - оЬ2.у; . у . ..*.. h

return temp; .j . . :>.-. ,. i; ..

1 . , .T . .1-. .

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

coord coord;:operator-()

X = -x; , .!-:,;,. . ;i,.-.n .л Л

у = -у; rt.;r -q 1 с-



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

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