Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 78
Текст из файла (страница 78)
у = у * ob2.y;return temp;544___СамоучительC++1 1 Перегрузка оператора / относительно класса coordcoord coord: : operator/ (coord ob2){coord temp;*temp.x = x / ob2.x;temp. у = у / ob2.y;return temp;int main ()coord ol (10, 10), o2(5, 3), o3;int x, y;o3 = ol * o2;o3.get_xy(x, y) ;cout « "(ol * o2) X: " « x « ", Y: " « у « "\n";o3 = ol / o2;o3.get_xy (x, y) ;cout « "(ol / o2) X: " « x « ", Y: " « у « "\n";return 0;2. Так перегружать оператор % нежелательно, поскольку перегруженная версияоператора не связана с его традиционным использованием.6.31.
// Перегрузка операторов < и > относительно класса coord#include <iostream>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 sj) { i = x; j = y; }int operator<(coord ob2);int operator>(coord ob2);};// Перегрузка оператора < для класса coordint coord::operator<(coord ob2)Приложение В. Ответы на вопросы и решения упражнений{return х<оЬ2.х && у<оЬ2.у;}// Перегрузка оператора > для класса coordint coord::operator>(coord ob2){return x>ob2.x && y>ob2.y;}int main(){coord 01(10, 10), o2(5, 3) ;if(ol>o2) cout « "ol > o2\n";else cout « "ol <= o2\n";if(ol<o2) cout « "ol < o2\n";else cout « "ol >= o2\n";return 0;6.41.
// Перегрузка оператора -- относительно класса coord^include <iostream>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 &i, int &j) { i = x; j = y; }coord operator — (}; // префиксная формаcoord operator — (int notused) ; // постфиксная форма};// Перегрузка префиксной формы оператора — для класса coordcoord coord: : operator — (){х--;у— ;return *this;II Перегрузка постфиксной формы оператора -- для класса coordcoord coord: : operator — (int notused}545Самоучитель C++546{x—;у—;return *this;int main ( ){coord olUO, 10);int x, y;ol — ; // декремент объектаol.get_xy (x, y) ;cout « " (ol — } X: " « x « ", Y: " « у « "\n";— ol; // декремент объектаol.get_xy {x, y) ;cout « "(~ol) X: " « x « ", Y: " « у « "\n";return 0;2.
// Перегрузка оператора + относительно класса coord^include <iostream>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 Sj) { i = x; j = y; }coord operator+(coord ob2); // бинарный плюсcoord operators(); // унарный плюс// Перегрузка бинарного оператора + для класса coordcoord coord::operator+(coord ob2)coord temp;temp.x = x + ob2.x;temp.у = у + ob2.y;return temp;II Перегрузка унарного оператора + для класса coordcoord coord::operator+ОПриложение В.
Ответы на вопросы и решения упражненийiftx<0)if <y<0)х = -х;у = -у;return *this;int main ()coord 01(10, 10), o2{-2, -2);int х, у;01 = ol + o2; // сложениеol.get_xy (х, у) ;cout « " (ol + o2) X: " « x « ", Y: " « у « "\n";02 = -Ю2; // абсолютное значениеo2 ,get_xy (х, у) ;cout « "(+o2) X: " « x « ", Y: " « у « "\n";return 0;6.51.
/* Перегрузка операторов — и / относительно класса coord сиспользованием дружественных функцийV^include <iostream>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; }friend coord operator-(coord obi, coord ob2);friend coord operator/(coord obi, coord ob2);// Перегрузка оператора — для класса coord// с использованием дружественной функцииcoord operator-(coord obi, coord ob2){coord temp;temp.x = obl.x — ob2.x;547_548СамоучительC++temp. у = obl.y - оЬ2.у;return temp;// Перегрузка оператора / для класса coord// с использованием дружественной функцииcoord operator/ (coord obi, coord ob2){coord temp;temp.x = obl.x / ob2.x;temp.
у = obl.y / ob2.y;return temp;int main ( ){coord ol (10, 10), o2(5, 3), o3;int x, y;.o3 = ol - o2;o3.get_xy (x, y) ;cout « "(ol ~ o2) X: " « x « ", Y: " « у « "\n";o3 = ol / o2;o3.get_xy{x, y) ;cout « "(ol / o2) X: " « x « ", Y: " « у « "\n";return 0;2. // Перегрузка оператора * для операций ob*int и int*ob#include <iostream>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 &i, int &j) { i = x,- j = y; }friend coord operator* {coord obi, int i) ;friend coord operator* (int i, coord ob2) ;};// Перегрузка оператора * первым способомcoord operator* (coord obi, int i)Приложение В.
Ответы на вопросы и решения упражненийcoord temp;temp.x = оЫ.х * i;temp. у = оЫ.у * i;return temp;// Перегрузка оператора * вторым способомcoord operator* (int i, coord ob2){coord temp;temp.x = ob2.x * i;temp . у = ob2 .у * i ;return temp;int main{){coord ol(10, 10} , o2;int x, y;o2 = ol * 2; // ob * into2.get_xy (x, y} ;cout « "(ol * 2) X: " « x « ", Y: " « у « "\no2 = 3 * ol; // int * obo2.get_xy (x, y) ;cout « "(3 * ol) X: " « x « ", Y: " « у « "\nreturn 0;3. Благодаря использованию дружественных оператор-функций, стало возможным получить, в качестве левого операнда, встроенный тип данных.
При использовании функций- членов, левый операнд должен быть объектом класса,для которого определяется оператор.4. /* Перегрузка оператора — относительно класса coordс использованием дружественных функций*/^include <iostream>using namespace std;class coord {int x, у; // значения координатpublic:coordO { x = 0; у = 0; }550_Самоучительcoord (int i, int j) { x = i; у = j; }void get_xyfint Si, int &j) { i = x; j = y; }// префиксная формаfriend coord operator — [coord &ob) ;// постфиксная формаfriend coord operator — (coord &ob, int notused) ;};// Перегрузка префиксной формы оператора — для класса coord// с использованием дружественной функцииcoord operator — (coord &ob)(ob.x — ;ob.y — ;return ob;// Перегрузка постфиксной формы оператора — для класса coord// с использованием дружественной функцииcoord operator — (coord &ob, int notused)(ob.x — ;ob.y — ;return ob;int main()i\coord ol(10, 10) ;int x, y;— ol ; / / декремент объекта olol.get_xy (x, y) ;cout « "( — ol) X: " « x « ", Y: " « у « "\n";ol — ; // декремент объекта olol.get_xy (x, y) ;cout « "(ol — ) X: " « x « ", Y: " « у « "\n";return 0;6.61.
^include <iostream>#include <cstdlib>using namespace std;C++Приложение В. Ответы на вопросы и решения упражненийclass dynarray {int *p;int size;public:dynarray(int s);int &put(int i);int get(int i);dynarray &operator=(dynarray Sob);// Конструкторdynarray::dynarray(int s){p = new int[s];if(!p) {cout « "Ошибка выделения памяти\пexit(l) ;1// Запоминание элементаint sdynarray: :put {int i){if (i<0 I I i>=size) (cout « "Ошибка нарушения границ массива !\п";exit(l) ;return p[i] ;// Получение элементаint dynarray: ; get (int i){if (i<0 | | i>=size) (cout « "Ошибка нарушения границ массива !\п";exit(l) ;return p[i] ;1// Перегрузка оператора = для класса dynarraydynarray fidynarray: :operator= (dynarray &ob){int i;55?552_Самоучительif (size! =ob.
size) {cout « "Нельзя копировать массивы разных размеров ! \n";exit(l);for(i=0; i<size; i++) p[i] = ob.pfi];return *this;int main (){int i;dynarray obi (10) , ob2{10), ob3(100);obl.put (3) - 10;i = obl.get<3) ;cout « i « "\n";Ob2 = obi;i = ob2.get(3) ;cout « i « "\n";// Выполнение следующей инструкции ведет к ошибкеobi = оЬЗ; // ! !!return 0;6.71.
^include <iostream>#include <cstring>^include <cstdlib>using namespace std;class strtype {char *p;int len;public:strtype(char *s) ;~strtype{) {cout « "Освобождение памяти по адресу " «(unsigned) p « '\ndelete []p;\char *get() { return p; }strtype &operator=(strtype &ob);C++ПриложениеВ.Ответынавопросыирешенияупражненийchar &operator[] (int i) ;};strtype: : strtype {char *s){int 1;1 - strlen(s) + 1;p = new char [1] ;if(!p) {cout « "Ошибка выделения памятиХп";exit(l) ;len = 1;strcpytp, s) ;}(f Присваивание объектаstrtype sstrtype: :operator= (strtype sob)t// Выяснение необходимости дополнительной памятиif (len < ob.len) { // требуется выделение// дополнительной памятиdelete [] p;p = new char г~гif(!p) fcout^ши^л„ _^„ — ....