Стандарты программирования на С++. 101 правило и рекомендация | страница 34
Логическую константность следует реализовывать с использованием членов, описанных как >mutable
. Когда константная функция-член класса оправданно требует модификации переменной-члена (т.е. когда эта переменная не влияет на наблюдаемое состояние объекта, например, если это кэшированные данные), объявите эту переменную-член как >mutable
. Заметим, что если все закрытые члены скрыты с использованием идиомы Pimpl (см. рекомендацию 43), описание >mutable
не является необходимым ни для кэшированной информации, ни для неизменного указателя на нее.
Модификатор >const
напоминает вирусное заболевание — появившись в вашем коде один раз, он приведет к необходимости соответствующего изменения сигнатур функций, которые еще не являются корректными в плане использования >const
. Это как раз не ошибка, а хорошее свойство, существенно увеличивающее мощь модификатора >const
, который еще не так давно был достаточно заброшен, а его возможности не вполне поняты и оценены. Переделка существующего кода для его корректности в плане использования >const
требует усилий, но они стоят того и даже позволяют выявить скрытые ошибки.
Корректное применение >const
дает отличные результаты и повышает эффективность. Чрезвычайно важно правильно и последовательно использовать модификатор >const
в ваших программах. Понимание того, как и где изменяется состояние программы, особенно необходимо, а модификатор >const
по сути документирует непосредственно в коде программы, где именно компилятор может помочь вам в этом. Правильное употребление >const
поможет вам лучше разобраться с вопросами проектирования и сделать ваш код более надежным и безопасным. Если вы выяснили, что некоторую функцию-член невозможно сделать константной, значит, вы более детально разобрались с тем, как, где и почему эта функция модифицирует состояние объекта. Кроме того, вы сможете понять, какие члены-данные объединяют физическую и логическую константность (см. приведенные ниже примеры).
Никогда не прибегайте к преобразованию константного типа в неконстантный, кроме случаев вызова функции, некорректной в плане использования модификатора >const
(не модифицирующей параметр, который тем не менее описан как неконстантный), а также такого редкого случая, как способ замены mutable в старом компиляторе, не поддерживающем эту возможность.
Пример. Избегайте >const
в объявлениях функций, принимающих параметры по значению. Два следующих объявления абсолютно эквивалентны: