|
Программирование >> Аргументация конструирования
Onefuuoftbt как функции-члены Вместо реализации оператора ка кней функции его можно сделать нестатической функцией-членом. В этом случае класс USDol lar будет выглядеть так: class USDollar public: USDollar (unsigned int d, unsigned inc. c} ; SSDoiiarS: ooeratcr+t () ; USDollar operator+(USDollarb s); protected: unsigned int dollars; unsigned int cents; JSDollar: ol laigned int ,ed int с ) dollars - d; = whiJe (cents >= 100; ( doilai cents ioc; и и результат D новом объекте USDollar USDollar: :operatGr- (USDollars s2) this-> необязательно int с s . ; unsigned int d ->dol . ars s2 .1 -s ; USDollar t (d, c) ; return Mtor + + чивает аргумент, / / изменяя значение переданного объекта USDollars USDollar::operator++() this->cents++; >= rhi5->cents 100; thi3->dollar3+-r; return 4his; int char* USDollar dl(1, 60) ; USDollar d2(2, 50); USDollar dMO, 0) ; d3 = dl + d2; + + d3; return 0; Я специально включил в приведенный ниже пример, чтобы подчеркнуть схожесть между реализациями этого оператора как функции-члена и как внешней функции. Разумеется, это не обязательно, поскольку this все равно будет подставляться по умолчанию. Сравните объявление USDollar :: operator+(USDollar£:) с : : operator+ (USDollarS, USDollari). На первый взгляд вариант члена класса имеет на один аргумент меньше, чем глобальный. Приведенный ниже пример сравнивает эти две версии. operator+ - вариант с функцией - не членом USDollar operator+ fUSDollars si, USDollarS s2) { unsigned int с ents + s2. cents; unsigned int d = si.dollars + s2.dollars; USDollar d(dollars,cents) ; return d; operator+ - вариант с функцией-членом USDollar operatort (USDollars si, USDollarS s2) unsigned int с >cents + s2.cent.s; unsigned int d = this->dollars + s2.dollars; USDollar t(dollars,cents); return t; Как видите, эти функции почти идентичны. Там, где функция - нечлен склад1вает si с s2, функция-член складывает текущий объект (тот, на который указывает this) с s2. Оператор, который является членом класса, всегда имеет на один аргумент меньше, чем не член класса; при этом подразумевается, что левый аргумент оператора - текущий объект. Еще одна nefteifUfSica что вы перегрузили один вариант оператора, не значит, что вы перегрузили все операторы С++ прекрасно отличает оператор operator* (double, USDollarS) от оператора double). Распросграненная ошибка № 4. Каждая версия оператора должна быть перегружена отдельно. Это не настолько существенно связывает нас, как могло бы показаться с первого взгляда. Во-первых, ничто не мешает одному оператору обращаться к другому оператору. В случае с функцией operator* () вы можете сделать, так: USDollar operator * (double f, USDollarS s) Когда стоит делать операторы членами класса Возникает вопрос: когда имеет смысл реализовывать оператор как функцию-член, а когда - как внешнюю функцию? Приведенные ниже операторы должны быть реализованы как функции-члены. = Присвоение () Вызов функции . [] Индекс . -> Членствов классе Для остальных операторов место их реализации особой роли не играет - в функции-члене или во внешней функции, за небольшим исключением. Например, приведенный ниже оператор не стоит реализовывать как функцию-член. USDollar operator*(double factor, USDollarS s); ; void fn(USDollari principle) \ i i .USDollar- interestExpense = interest*principle;- ; } : Чтобы быть функцией-членом, operator* {) должен .быть членом класса double. Однако простые смертные не могут добавлять операторы во встроенные классы. А значит, такие операторы должны быть внешними функциями. Если вы имеете доступ к впутреппостям класса, сделайте перегружаемый опера: тор членом класса. Это оправдывается, если оператор, например, изменяет объект, i с которым осуществляется операция. ; JEefteiftifSica onefuunofioe с помощью нем£ш>ю hfteofiasoiaHusL 0Umo€ Ест один, принципиально иной способ определения операторов для пользовательских классов. Задумайтесь над приведенным ниже примером. int i = 1; double d = 1.0; / / выражение №1 d = i + d; inline USDollar operator* (USDollars s, double!) { используем предыдущее определение return f*s; Вторая версия вызывает первую, просто поставив аргументы в обратном порядке. Машинный ко ункции вставляется прямо в место вызова этой / .-1Л функции.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |