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