Программирование >>  Аргументация конструирования 

1 ... 84 85 86 [ 87 ] 88 89 90 ... 108


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Л функции.



1 ... 84 85 86 [ 87 ] 88 89 90 ... 108

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