Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Void main ( )




Comp ()

Comp (float a, float b)

Class comp

Void main ()

Comp (float a, float b)

Class comp

Перегруженные операции

Лекция 20

Для типов float, double, int, long определены операции +, -, *, /, %, +=, -= и др. Но для типов, которые получены с помощью классов, эти операции надо реализовать самостоятельно. С этой целью можно было бы применить

функции-члены, например: plus () для сложения, plusequal () для += и т.д. Но это неудобно. Значительно лучше применить общеупотребительные знаки +, += и прочие. А для этого надо перегрузить упомянутые или другие операции для объектов описанного класса.

Перегрузить можно любую операцию, кроме следующих:., .*, ::, ?:.

Это можно сделать двумя способами:

1) С помощью перегруженных операторов – функций, которые являются членами класса;

2) С помощью перегруженных функций, которые являются friend (дружественными функциями) для данного класса.

Рассмотрим первый способ. В этом случае синтаксис для перегруженной операции имеет вид:

имя_класса& operator операция (имя_класса& параметр)

Рассмотрим пример для перегруженной операции += для комплексных чисел.

# include <stdio.h>

{

float Re, Im;

public:

{

Re=a;

Im=b;

}

comp& operator += (comp& x)

{

Re+=x.Re;

Im+=x.Im;

return *this;

}

void put_info (char *Str)

{

printf (“%s.Re=%f %s.Im=%f\n”, Str, Re, Str, Im);

}

};

{

comp C1 (2, -2), C2 (-2, 2);

C1+=C2;

C1.put_info (“C1”);

}

 

В результате перегруженной операции += значение С1 изменится. Ее адрес при вызове операции += был передан в this. Второй параметр был передан в качестве фактического параметра вместо формального х. Результат возвращается через *this. Если нужно сложить два комплексных числа и при этом оставить их значения без изменений, можно использовать второй способ перегрузки операции с помощью дружественной функции. Для этого примера прототип такой функции следующий:

friend comp operator + (comp& C1, comp& C2);

Необходимо еще раз обратить внимание на то, что эта функция не являеться членом класса. Программа для этого случая следующая:

# include <stdio.h>

{

float Re, Im;

public:

{

Re=a;

Im=b;

}

{

}

friend comp operator + (comp& C1, comp& C2);

void put_info (char *Str)

{

printf (“%s.Re=%f %s.Im=%f\n”, Str, Re, Str, Im);

}

};

{

comp C1 (2, -2), C2 (-2, 2);

comp C3;

C3=C1+C2;

C3.put_info (“C3”);

}

comp operator + (comp& C1, comp& C2);

{

comp V;

V.Re=C1.Re + C2.Re;

V.Im=C1.Im + C2.Im;

return V;

}

При перезагрузке операций следует выполнять следующие правила:

1) Приоритеты операций и правила ассоциаций, принятые для типов float, double, int, long, должны оставаться неизменными также и для перегруженных функций-операций;

2) Функции-операции не могут изменить поведение операции по отношению к стандартным типам float, double, int, long;

3) Функция-операция должна быть или элементом класса, или воспринимать один или несколько аргументов, которые имеют тип класса;

4) Функция-операция не может иметь аргументы по умолчанию;

5) За исключением operator = () все функции-операции наследуются.

 




Поделиться с друзьями:


Дата добавления: 2015-06-27; Просмотров: 328; Нарушение авторских прав?; Мы поможем в написании вашей работы!


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



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




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