Каждый раз, когда вы знаете, что этот метод выигрывал Чтобы не изменять состояние объекта, вы должны объявить его постоянным.
Это помогает читать ваш код. И это помогает, когда вы пытаетесь изменить состояние объекта - компилятор вас остановит.
Я использую const почти при каждой возможности, и мне нравится тот факт, что она не только документирует намерение, но и обеспечивает его соблюдение. Возможности языка не могут быть лучше этого, и все же const, как ни странно, не любят. (На самом деле кажется, что большинство самопровозглашенных программистов C ++ не могут объяснить разницу между int *, int * const, const int *
и const int * const
. )
Хотя этого никогда не могло бы произойти из-за происхождения 'C', я часто думаю, что C ++ был бы лучшим языком, если бы по умолчанию был const и было бы необходимо либеральное добавление (скажем) 'var' или другого подобного ключевого слова чтобы разрешить изменение переменных после построения.
Раньше я объявляю функции как const, но теперь я редко, если вообще когда-либо, делаю это.
Основная проблема заключалась в том, что если бы я хотел изменить функцию с константы на неконстантную, это означало бы, что все другие константные функции, вызывающие эту функцию, также нужно было бы изменить на неконстантные.
Это происходило чаще, чем я думал, из-за оптимизации. Например, у меня была функция GetData (), которая использовалась для возврата указателя на данные, но позже я оптимизировал ее, чтобы настроить данные только в том случае, если GetData () заканчивается вызовом (который изменяет состояние объекта, поэтому он больше не является константой). функция).
То же самое и для других функций, которые могли выполнять некоторые вычисления без изменения состояния объекта, но в какой-то момент кэширование результата имело больше смысла, поскольку функция вызывалась много раз и была узким местом.
Также на практике, по крайней мере для моего проекта, я увидел очень мало пользы от объявления моих функций как const.
Предположим, вы говорите о методах, например:
struct Example {
void f() const;
};
Тогда, если они должны быть вызваны для объекта const, метод должен быть const.
Когда у вас есть объект const
, компилятор позволит вам вызывать только те методы, которые помечены как безопасные с помощью ключевого слова const
. Фактически, только методы-члены имеют смысл как const
методы.
В C ++ каждый метод объекта получает неявный this
указатель на объект; Метод const
просто получит указатель const
this
.
Нечасто ....
Хотя все ответы верны, если вы используете библиотеку, которая не const правильная , тогда трудно использовать const во всех местах, где вы должны использовать Это.
Если у вас есть старый API, который принимает char * , который для всех логических целей должен быть const char * , то вам нужно либо забыть const в своем коде, либо выполнить какой-то некрасивый кастинг. В этом случае я забываю const.
Как можно чаще. Функции, которым не нужно изменять члены данных, должны быть объявлены как const. Это делает код более понятным и может дать подсказку компилятору для оптимизации.