Правильность в целом важна, но примеры, которые вы используете, на самом деле не имеют значения Например:
void foo (const int i, const string s)
Я был бы настолько смел, чтобы объявить этот прототип неправильным . Если у вас только что был прототип
void foo (int i, string s)
тогда это уже обещание не изменять значения, которые пользователь передает для i
и s
. (поскольку вы получаете копий этих значений, а не ссылки на оригинал) Таким образом, единственное, что const
делает в этом случае, - это просит компилятор пожаловаться, если вы случайно попытались изменить i
или s
. Но есть и другие способы достижения этого эффекта - на самом деле нет никакого бизнеса, подвергаемого внешним воздействиям.
Теперь, следующее использование const
было бы действительно полезно:
void foo (int i, const string &s)
это сохраняет ваше обещание не изменять s
, но теперь вы получаете выигрыш в производительности, потому что больше не нужно делать копию s
.
Некоторые другие варианты использования хороши:
const size_t size = vec.size();
это хорошо. (как только вы замените uint
на size_t
), здесь нет никакого выигрыша в производительности, но он самодокументируется и может защитить вас от глупых несчастных случаев.
const string s2 = s1 + "hello ";
Это тоже хорошо. Хотя, опять же, я мог бы вместо этого сделать ссылку:
const string &s2 = s1 + "hello ";
Этот
operator const bool () const { return ...; }
наиболее не имеет значения. Вам, вероятно, следует реализовать operator bool
вместо operator const bool
, даже если по какой-то другой причине, кроме первой, люди ожидают.
Но это может иметь значение для классов, которые имеют неконстантные версии. Возвращая const
, это не вопрос вкуса или стиля, а объявление "Я собираюсь вернуть вам новый объект, но вам не разрешено вызывать какие-либо его неконстантные функции". Обычно это плохая идея - сделайте это const
, только если вы действительно хотите сделать это заявление.