Разница между
Number& Number::operator++ () {
++value_;
return *this;
}
и
Number Number::operator++ () {
++value_;
return *this;
}
заключается в том, что при использовании первого кода следующее выражение:
++(++(++someNum));
приращенияsomeNum
Трижды.Смотрите вывод здесь: http://ideone.com/y9UlY
Однако, когда вы используете второй, это
++(++(++someNum));
увеличивает someNum
только ОДИН РАЗ !!Смотрите вывод здесь: http://ideone.com/eOLdj
Это потому, что когда вы возвращаете ссылку из operator++()
, второй и третий ++
вызывает один и тот же объект с именем someNum
и, следовательно, он увеличивает то же самоеобъект, все время.Но когда вы возвращаете по значению, второй и третий ++
вызывает временный объект, который вы вернули из operator++()
.Следовательно, второй и третий вызов не увеличивают someNum
, вместо этого он увеличивает временные объекты, которые уничтожаются в конце выражения.
Теперь, если временные объекты уничтожаются, зачем создавать затем впервое место?В конце концов, его оператор предварительного увеличения, который означает, что временный и исходный объект будут иметь одинаковое значение.Таким образом, хорошее дизайнерское решение - возвращаться по ссылке при определении оператора предварительного увеличения, чтобы избежать создания временных и повысить производительность.