Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
}<br />
USDoIlar d3 (0, 0) ;<br />
d3 - dl + d2;<br />
+ + d3;<br />
return 0;<br />
Я специально включил "this->" в приведенный ниже пример, чтобы подчеркнуть<br />
схожесть между реализациями этого оператора как функции-члена и как внешней<br />
функции. <strong>Р</strong>азумеется, это не обязательно, поскольку this все равно будет подставляться<br />
по умолчанию.<br />
Сравните объявление USDoIlar: : operators fUSDollars) с : : operator*<br />
(uSDollarb, USDollars). На первый взгляд вариант члена класса имеет на один аргумент<br />
меньше, чем глобальный. Приведенный ниже пример сравнивает эти две версии.<br />
//operator! — вариант с функцией — не членом<br />
USDoIlar operators fUSDollars si, USDollars s2)<br />
(<br />
unsigned int с = si.cents + s2.cents;<br />
unsigned int d = si.doliars + s2.doliars;<br />
USDoIlar d(dollars,cents);<br />
return d;<br />
}<br />
//operator+ — вариант с функцией-членом<br />
USDoIlar operator! (USDollars si, USDollars s2)<br />
{<br />
unsigned int с = this->cents + s2.cents;<br />
unsigned int d = this->dollars + s2.doliars;<br />
USDoIlar t(dollars,cents);<br />
return t;<br />
}<br />
Как видите, эти функции почти идентичны. Там, где функция — нечлен складывает si<br />
с s2, функция-член складывает "текущий объект" (тот, на который указывает this) с s2.<br />
Оператор, который является членом класса, всегда имеет на один аргумент<br />
меньше, чем не член класса; при этом подразумевается, что левый аргумент<br />
оператора — текущий объект.<br />
Еще oqna пе/гефцзка<br />
То, что вы перегрузили один вариант оператора, не значит, что вы перегрузили все<br />
операторы C++ прекрасно отличает оператор operator* (double, USDollars) от<br />
оператора operator*(USDollarS, double).<br />
<strong>Р</strong>аспространенная ошибка № 4. Каждая версия оператора должна быть перегружена<br />
отдельно.<br />
Это не настолько существенно связывает нас, как могло бы показаться<br />
с первого взгляда. Во-первых, ничто не мешает одному оператору обращаться<br />
к другому оператору. В случае с функцией operator* () вы можете сделать,<br />
например, так:<br />
USDoIlar operator * (double f, USDollar& s)<br />
Глава 24. Перегрузка операторов 273