Студопедия

КАТЕГОРИИ:


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

Определение дополнительных функций-операторов




Подобно другим функциям языка C++, функции-операторы могут быть перегружены. При этом есть несколько способов вызова операторов. Например, с помощью оператора "+" можно сложить объект класса CCurrency с константой типа int или long. (В определенной выше функции предполагается, что оба операнда являются объектами класса CCurrency.) Для этого в класс CCurrency нужно добавить следующую функцию.

CCurrency operator+ (long Dol) { return CCurtency (Dollars + Dol, Cents); }

Включение этой функции позволит использовать оператор «+» следующим образом.

CCurrency Advertising (235, 42);//...Advertising+ = 100;

Компилятор будет интерпретировать выражение Advertising + 100 как

Advertising.operator+ (100)

и, следовательно, вызывать вновь определенную версию функции operator+. Тем не менее, целочисленную константу нельзя поставить первой, так как компилятор будет интерпретировать выражение 100 + Advertising как

100.operator+ (Advertising) // бессмысленно!

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

// определяется глобально:CCurrency operator+ (long Dol, const CCurrency SCurr) { return CCurrency (Dol + Curr.Dollars, Curr.Cents); }

Но при использовании этой функции также могут возникнуть проблемы. Так как она не является функцией-членом класса CCurrency, то не имеет доступа к закрытым переменным этого класса (а именно, к Dollars и Cents). Для получения такого доступа функцию нужно сделать дружественной классу CCurrency, объявив ее внутри определения CCurrency с использованием спецификатора friend.

class CCurrency { // другие объявления... friend CCurrency operator+ (long Dol, const CCurrency &Curr); // другие объявления... };

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

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

CCurrency Advertising (235, 42);//...Advertising = 100 + Advertising;

Теперь компилятор проинтерпретирует выражение 100 + Advertising как

operator+ (100, Advertising)

и, следовательно, вызовет дружественную версию функции-оператора.

Заметим: можно сделать дружественными две первые версии функции operator+, не определяя их как функции-члены класса (хотя особенного преимущества это не дает).

friend CCurrency operator+ (const CCurrency &Curr1, const CCurrency &Curr2); friend CCurrency operator+ (const CCurrency &Curr, long Dol);

Функция, перегружающая оператор и не являющаяся методом класса, должна иметь хотя бы один параметр – объект класса. Следовательно, функцию-оператор нельзя использовать для изменения стандартного смысла операторов в выражении, содержащем только данные встроенных типов.

Дружественные классы

В определении класса также можно объявить дружественным другой класс, например:

class A{//...friend class FriendOfA;//...};

Благодаря такому объявлению любая функция-член класса FriendOfA имеет доступ к закрытым и защищенным членам класса А.

 

Ниже приведено полное описание класса CCurrency вместе с функцией, не являющейся его членом.

#include <iostream.h>class CCurrency{ private: long Dollars; int Cents; public: CCurrency () { Dollars = Cents = 0; } CCurrency (long Del, int Cen) { SetAmount (Dolf Cen); } void GetAmount (long *PDol, int *PCen} { *PDol = Dollars; *PCen = Cents; } void PrintAmount {) { cout.fill 'O'); cout.width (1); cout << '$' << Dollars << '.'; cout.width (2); cout << Cents << '\n'; } void SetAmount (long Dol, int Cen) { // проверка суммы центов, которая превышает 100: Dollars = Dol +• Cen / 100; Cents = Cen % 100; } CCurrency operator+ (const CCurrency &Curr) { return CCurrency (Dollars + Curr.Dollars, Cents + Curr.Cents); } CCurrency operators- (long Dol) { return CCurrency (Dollars + Dol, Cents); } friend CCurrency operator+ (long Dol, const CCurrency &Curr); }; CCurrency operator+ (long Dol, const CCurrency &Curr){ return CCurrency (Dol + Curr.Dollars, Curr.Cents);}

Следующая программа демонстрирует использование всех трех функций-операторов, определенных выше.

void main() { CCurrency Advertising (235, 42);CCurrency Rent (823, 68); CCurrency Entertainment (1024, 32); CCurrency Overhead; Overhead = Advertising + Rent + Entertainment; Overhead.PrintAmount (); Overhead = Overhead + 100; Overhead.PrintAmount (); Overhead =100 + Overhead; Overhead.PrintAmount (); }

На печать будут выведены значения.

$2083.42 $2183.42 $2283.42

Таким образом, определение трех версий функций-операторов дает возможность применить операцию сложения к двум объектам – объекту и константе, а также к константе и объекту. Четвертая возможная комбинация из двух констант дает стандартную операцию сложения. Далее в параграфе «Конструкторы преобразования» рассмотрена технология создания специального конструктора, исклю­чающего две версии функции operator+ из класса CCurrency.

Усовершенствование класса CCurrency

Класс CCurrency можно усовершенствовать, добавив средства для обработки отрицательных значений денежных сумм и перегрузив другие операторы (обычно при присваивании отрицательной суммы результат непредсказуем). Можно определить функции-операто­ры для операции вычитания двух объектов или объекта и константы, а также для операций умножения или деления объекта на константу.

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

 




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


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


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



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




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