|
Программирование >> Расширенная версия языка c++
лра]кне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 с-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |