05.09.2016 Views

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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

int i;<br />

i = f ! ) + 12 - g {) ) ;<br />

}<br />

Временный объект, возвращенный функцией f (), существует, пока выполняется<br />

функция д() и пока выполняется умножение. Там, где стоит точка с запятой, этот<br />

объект уже недоступен.<br />

operator++()<br />

В отличие от operator* (), функция operator** (} модифицирует свой аргумент.<br />

А значит, вам не нужно создавать временный объект или возвращать результат по<br />

значению. Вычисляемый результат можно хранить прямо в s. Вызывающей функции<br />

может быть возвращен предоставленный оператору аргумент.<br />

//это будет отлично работать<br />

USDollarfi operator**(USDollarb s)<br />

{<br />

s.cents++;<br />

if (E.cents >= 100)<br />

{<br />

s.cents -=100;<br />

£.dollars**;<br />

}<br />

retuin s;<br />

}<br />

<strong>Р</strong>ассмотрите приведенный ниже пример, который содержит одну очень хитрую<br />

ошибку.<br />

//это не очень надежная версия<br />

USDollar operator**(USDollar& s)<br />

{<br />

s . cents**;<br />

if {= 100)<br />

{<br />

£'.. cents - = 100 ;<br />

к.dollars**;<br />

}<br />

return s;<br />

<strong>Р</strong>аспространенная ошибка № 3. Возвращая s по значению, функция заставляет<br />

компилятор генерировать копию объекта. Это отлично сработает в выражениях<br />

типа а = ++Ь, но что будет с выражениями типа ++(++а)? Мы<br />

ожидаем, что а будет увеличено на 2. Однако при приведенном выше переопределении<br />

этого оператора, объект а будет увеличен на 1, а затем на 1 будет<br />

увеличена его копия, а не сам объект а.<br />

Конструкция вида +* (*+а) не очень распространена, но все же допустима. В любом<br />

случае имеется еще множество примеров, в которых такой оператор не будет работать<br />

правильно.<br />

Можно сформулировать следующее правило: если оператор изменяет значение<br />

своего аргумента, возвращайте аргумент по ссылке. Если оператор не<br />

изменяет значения своих аргументов, создавайте новый объект и возвращайте<br />

его по значению. Входные аргументы лучше всегда передавать по ссылке.<br />

Глава 24. Перегрузка операторов 271

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

Saved successfully!

Ooh no, something went wrong!