05.09.2016 Views

Стефан Р. - С++ Для чайников

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!