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

1 ... 55 56 57 [ 58 ] 59 60 61 ... 227


Здесь временный объект, возвращаема! цией operator+(), используется непосредственно. Естественно, что после выполнения этой инструкции временный объект удаляется.

2. В слеющей версии предыщей программы относительно класса coord перегружаются операторы - и

Перегрузка операторов +, - и = относительно класса COord #include <iostream> usin espace std;

;: J - - - ii, ,

class coord {

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

public: . .-

coord 0 { x = 0; }

coord (int i, in) { x у ; }

void get xy(int &i, int sj) { i = x; j = y; }

coord operator+ (coord ob2) ; ... . ,

coord operator- (coord ob2) ;

coord operator= {coordQb2) ;

Перегрузка оператора + относительно класса coord coord coord: :operator+(coord ob2j

coord

temp.x = x + ob2.x;

у = у

return temp;

оператора - относительно класса coord

coord

coord

= x -= у -

return temp;

Перегрузка оператора = относительно класса coord coor aL :.::::= (coord ob2)

x = оЬ2 . X ;




При перегрузке бинарного оператора левый операнд передается функции вно, а правый оператор передается функции в качестве аргумента.

Теперь рассмотрим присваивания. В очередь не-

обходимо отметить, что левый операнд (т. е. объект, которому присваивается значение) после выполнения операции меняется. Здесь сохраняется обычный смысл присваивания. Во-вторых, функция возвращает указатель *this. Это

return is; ащение объекта,

которому присвоено значение , у.::}.,

int main{J ~

coord ol (10, 10), о2(5, 3), оЗ;

int x, y; . . \ I---.-:.

.. 1 .,>.-

o3 = ol + o2; сложение двух объектов ...

вызов функции operator+ () o3.get xy (x, у) ; >

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

оЗ = ol - о2; вычитание двух объектов . :у

вызов функции opeirator- О ,. - :

o3.get xy (х, у) ;

cou (о1 - о2) х , у \п ; . ...

оЗ = ol; присваивание объекта зов функции operator= ( } оЗ . get xy (х, , :

couW< (оЗ = ol) , у \п ;

return 0; . 1 , . . .:--::!

Реализация функции mtoi-() похожа на реализацию функции operator+().

Однако она иллюстрирует ту особенность перегрузки операторов, где важен порядок следования операндов. При создании функции operator+() порядок следования операндов значения не имел. (То ест тождественно В+А.) Однако результат операции вычитания зависит от порядка следования операндов. Поэтому, чтобы правильно перегрузить оператор вычитания, необходимо вычесть правый операнд из левого. Поскольку левый операнд генерирует вызов функции порядок вычитания должен быть сле-

дующим:

х - оЬ2 .х;



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

происходит потому, что функция operator=() возвращает тот объект, которому присваивается значение. Таким образом удается выстраивать операторы присваивания в цепочки. Как вы уже должны знать, в C++ следующая инструкция синтаксически правильна (и на практике вполне обычна):

a = b = c = d=0;

Возвращая указателе Шв, перегруженный оператор присваивания дает возможность подобным образом выстраивать объекты типа coord. Например, представленная ниже инструкция вполне корректна:

оЗ = о2 = о1;

Запомните, нет правила ующего, чтобы перегруженная оператор-

функция присваивания возвращала объект, полученный в результате присваивания. Однако если вы хотите перегрузить оператор = относительно класса, то, как и в случае присваивания встроенных типов данных, он должен возвращать указатель *this.

3. Имеется возможность перегрузить оператор относительно класса так, что правый операнд будет объектом встроенного типа, например, целого, а не объектом того класса, членом которого является оператор-функция. Например, в приведенном ниже примере оператор + перегружается так, что прибавляет целое значение к объекту типа coord:

Перегрузка оператора + как для операции оЬ+оЬ, так и для операции ob+int . :

#include <iostteam> ...

using namespace std; . .. .

class coord { . \ ,

in X, у; значения координат -ч,/.- -г.:

public: . i,.

coord О { x = 0; у 0; } .

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

void get xy (Int fii, int i j) { i = x; j = y; } ...

coord operator+(coord ob2); ob + ob coord operator+(int i); ob + int

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

coord coord: :operator+-(coord оЬ2)

coord temp;

temp.x = x +ob2.x; ,

temp.у = у +оЬ2.у;

return temp;



1 ... 55 56 57 [ 58 ] 59 60 61 ... 227

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