Как часто вы объявляете свои функции постоянными? - PullRequest
15 голосов
/ 10 марта 2010

Считаете ли вы это полезным?

Ответы [ 7 ]

24 голосов
/ 10 марта 2010

Каждый раз, когда вы знаете, что метод не изменит состояние объекта, вы должны объявить его постоянным.

Это помогает читать ваш код. И это помогает, когда вы пытаетесь изменить состояние объекта - компилятор остановит вас.

11 голосов
/ 10 марта 2010

Как можно чаще. Функции, которым не нужно изменять элементы данных, должны быть объявлены как const. Это делает код более понятным и может дать подсказку компилятору для оптимизации.

6 голосов
/ 10 марта 2010

Когда у вас есть объект const, единственные методы, которые компилятор разрешит вам вызывать, это те, которые помечены как безопасные ключевым словом const. Фактически, только методы-члены имеют смысл как const методы.

В C ++ каждый метод объекта получает неявный this указатель на объект; Метод const просто получит указатель const this.

3 голосов
/ 10 марта 2010

Предполагается, что вы говорите о методах, например:

struct Example {
  void f() const;
};

Тогда, если они должны вызываться на const-объекте, метод должен быть const.

2 голосов
/ 10 марта 2010

Не достаточно часто ....

Хотя все ответы верны, если вы используете библиотеку, которая не является const правильной , тогда трудно использовать const во всех местах, где вы должны ее использовать.

Если у вас есть старый API, который принимает char *, который для всех логических целей должен быть const char *, то вы должны либо забыть const в своем коде, либо сделать какой-то уродливый кастинг. В этом случае я забываю const.

1 голос
/ 10 марта 2010

Я использую const практически при каждой возможности, и, как и тот факт, что он предоставляет как документацию о намерениях, так и обеспечивает соблюдение этого намерения. Языковые возможности не становятся намного лучше, и все же const любопытно нелюбим. (Реальность такова, что большинство самопровозглашенных кодеров C ++ не могут объяснить разницу между int*, int*const, const int* и const int*const.)

Хотя это никогда не могло произойти из-за его происхождения 'C', я часто думаю, что C ++ был бы лучшим языком, если бы const был значением по умолчанию и требовалось либеральное добавление (скажем) 'var' или какого-либо подобного ключевого слова, чтобы разрешить модификацию переменных после постройки.

0 голосов
/ 10 марта 2010

Раньше я объявлял функции как const, но теперь я редко, если вообще когда-либо, делаю это больше.

Основная проблема заключалась в том, что если бы я захотел изменить функцию с const на неконстантную, это означало бы, что все другие функции const, вызывающие эту функцию, также должны быть изменены на неконстантные.

Это происходило чаще, чем я думал, из-за оптимизации. Например, у меня была функция GetData (), которая использовалась для возврата указателя на данные, но позже я оптимизировал настройку данных только в том случае, если вызывается GetData () (который изменяет состояние объекта, поэтому он больше не является константой). функция).

То же самое относится и к другим функциям, которые могут выполнять некоторые вычисления без изменения состояния объекта, но в какой-то момент имеет смысл кэшировать результат, поскольку функция вызывается много раз и является узким местом.

Также на практике, по крайней мере, для моего проекта, я видел очень небольшую выгоду от объявления своих функций как постоянных.

...