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