Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Перегрузка бинарных операторов

Итак, операторная функция бинарного оператора может быть объявлена как нестандартная функция-член, и может быть объявлена глобальной т.е. с помощью дружественности.

Когда операторная функция бинарного оператора объявляется как нестандартная функция- член, она должна быть объявлена в виде:

<возв.тип> operator Х (<тип параметра> par);

где: <возв.тип> – тип возвращаемого функцией результата,

Х – перегружаемый оператор,

<тип параметра> и par – тип параметра и сам параметр, который передается в функцию. В этот параметр будет передан тот объект, который в самом выражении (в описании операторной функции) стоит справа от оператора. Объект, стоящий слева от оператора, передается неявно с помощью указателя this.

Рассмотрим пример, в котором в качестве объекта представляется точка с координатами x, y. Надо организовать операторную функцию сложения и вычитания для координат двух точек.

class Coord

{

int x, y;

public:

Coord()

{

x=0;y=0;

}

Coord(int _x, int _y)

{

x=_x; y=_y;

}

void Print()

{

cout <<"x="<<x<<"y="<<y<<endl;

}

Coord operator+(Coord& ob);

Coord operator-(Coord& ob);

};

//===============================================

Coord Coord::operator+(Coord& ob)

{

Coord temp_ob;

temp_ob.y=y+ob.y;

temp_ob.x=x+ob.x;

return temp_ob;

}

//===============================================

Coord Coord::operator-(Coord& ob)

{Coord temp_ob;

temp_ob.y=y-ob.y;

temp_ob.x=x-ob.x;

return temp_ob;

}

//================================

void main()

{

Coord a(4,6),b(7,8),c;

c=a+b;

c.Print();

c=a-b;

c.Print();

}

 

Когда операторная функция бинарного оператора объявляется как глобальная, она должна быть объявлена в виде:

<возв.тип> operator Х (<тип парам_1> par_1, <тип парам_2> par_2);

где: <возв.тип> – тип возвращаемого функцией результата,

Х – перегружаемый оператор,

<тип парам_1> par_1 и <тип парам_2> par_2 – типы параметров и сами параметры, которые передаются в функцию. По крайней мере один из этих параметров должен иметь тип класса, для которого перегружается оператор.

Хотя особых ограничений на тип возвращаемого параметра бинарных операций нет, большинство операторов возвращают либо тип класса, либо ссылку на тип класса.

Рассмотрим пример тот же пример, но операторная функция, которую надо организовать будет глобальной.

class Tpoint

{

int x,y;

public:

Tpoint()

{

x=0;

y=0;

printf("работал конструктор без параметров");

}

Tpoint(int xx, int yy)

{

x=xx;

y=yy;

printf(" работал конструктор с параметрами ");}

void pechat();

friend Tpoint operator+(Tpoint& P1, Tpoint& P2);

~Tpoint(){printf("\n работал деструктор");}

};

//===============================================

void Tpoint::pechat()

{

cout<<endl;

cout<< x <<" "<<y<<endl;

}

//===============================================

Tpoint operator+(Tpoint& P1, Tpoint& P2)

{

Tpoint g;

g.x=P1.x+P2.x;

g.y=P1.y+P2.y;

return g;

}

//===============================================

void main()

{

clrscr();

Tpoint a(1,2);

a.pechat();

Tpoint b(10,20);

b.pechat();

Tpoint c;

c=a+b;

c.pechat();

cout<<endl;

getch();

}

Рассмотрим еще один вариант примера, когда передаваемый параметр имеет тип, отличный от типа класса, в данном случае - целый.

 

class Tpoint

{

int x,y;

public:

Tpoint()

{x=0;

y=0;

printf(" konstryktor bez param");

}

Tpoint(int xx, int yy)

{

x=xx;

y=yy;

printf(" konstryktor c param ");

}

void pechat();

Tpoint operator+(int n);

~Tpoint(){printf("\n destryktor");}

};

//=======================================

void Tpoint::pechat()

{

cout<<endl;

cout<< x <<" "<<y<<endl;

}

//=======================================

Tpoint Tpoint::operator+(int n)

{

Tpoint g;

g.x=x+n;

g.y=y+n;

return g;

}

//=======================================

void main()

{clrscr();

Tpoint a(1,2);

a.pechat();

Tpoint c;

c=a+22;

c.pechat();

cout<<endl;

getch();

}

 

<== предыдущая лекция | следующая лекция ==>
Перегрузка (переопределение) операций | Перегрузка оператора присваивания
Поделиться с друзьями:


Дата добавления: 2014-01-03; Просмотров: 423; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.