Стандарты программирования на С++. 101 правило и рекомендация | страница 51
>// ---- Префиксные операторы -----------------------
>T& T::operator++() { // Префиксный вид:
> // выполнение // - Выполнение
> // инкремента // действий
> return *this; // - return *this;
>}
>T& T::operator--() { // Префиксный вид:
> // Выполнение // - Выполнение
> // декремента // действий
> return *this; // - return *this;
>}
>// ---- Постфиксные операторы ---------------------
>T T::operator++(int) { // Постфиксный вид:
> T old(*this); // - Запоминаем старое значение
> ++*this; // - Вызов префиксной версии
> return old; // - Возврат старого значения
>}
>T T::operator--(int) { // Постфиксный вид:
> T old(*this); // - Запоминаем старое значение
> --*this; // - Вызов префиксной версии
> return old; // - Возврат старого значения
>}
В вызывающем коде лучше использовать префиксные операторы, если только вам не требуется исходное значение, возвращаемое постфиксной версией. Префиксная форма семантически эквивалентна, она вводится практически так же, и зачастую немного эффективнее, так как создает на один объект меньше. Это не преждевременная оптимизация, а устранение преждевременной пессимизации (см. рекомендацию 9).
Шаблоны, используемые для научных вычислений (например, шаблоны для представления тензоров или матриц), к которым предъявляются жесткие требования по производительности. Для таких шаблонов часто приходится искать более эффективные способы реализации префиксных форм операторов.
[Cline99] §23.07-08 • [Dewhurst03] §87 • [Meyers96] §6 • [Stroustrup00] §19.3 • [Sutter00] §6, §20
29. Используйте перегрузку, чтобы избежать неявного преобразования типов
Не приумножайте объекты сверх необходимости (Бритва Оккама): неявное преобразование типов обеспечивает определенное синтаксическое удобство (однако см. рекомендацию 40), но в ситуации, когда допустима оптимизация (см. рекомендацию 8) и желательно избежать создания излишних объектов, можно обеспечить перегруженные функции с сигнатурами, точно соответствующими распространенным типам аргументов, и тем самым избежать преобразования типов.
Когда вы работаете в офисе и у вас заканчивается бумага, что вы делаете? Правильно — вы идете к копировальному аппарату и делаете несколько копий чистого листа бумаги.
Как бы глупо это ни звучало, но зачастую это именно то, что делает неявное преобразование типов: создание излишних временных объектов только для того, чтобы выполнить некоторые тривиальные операции над ними и тут же их выбросить (см. рекомендацию 40). В качестве примера можно рассмотреть сравнение строк: