В чем преимущества const в С++ (и C) для непосвященных?
Преимущества const в С++?
Ответ 1
Конст особенно полезен с указателями или ссылками, переданными функции - это мгновенно понятный "контракт API", который функция не будет изменять переданный объект.
Смотрите также: http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.4
Ответ 2
Кажется довольно очевидным - он не позволяет вам изменять то, что не следует изменять.
Изменить: для получения дополнительной информации всегда смотрите Herb Sutter.
Ответ 3
При использовании в качестве ссылки на константу в функции она позволяет вызывающему абоненту знать, что передаваемая вещь не будет изменена.
void f(Foo &foo, const Bar &bar) { ... }
В этом случае вызывающий абонент будет знать, что параметр foo
может быть изменен, но bar
не будет. Компилятор выполнит это при компиляции тела f()
, так что bar
никогда не будет изменен и никогда не будет передан другой функции, которая могла бы ее изменить.
Все вышеперечисленные гарантии можно обойти с помощью const_cast
, поэтому такой бросок считается "опасным" (или, по крайней мере, подозрительным).
Ответ 4
Я не настолько убежден в аспекте "безопасности" const (есть плюсы и минусы).... однако, что он разрешает, это определенный синтаксис, который вы не можете обойтись без const
void blah(std::string& x)
{}
может принимать только объект std::string... Однако если вы объявите его const: -
void blah(const std::string& x) {}
теперь вы можете сделать
blah("hello");
который вызовет соответствующий конструктор, чтобы сделать std::string
Ответ 5
Кроме того, используя const, вы указываете свое намерение использовать переменную или параметр. Это хорошая практика программирования ( " Стиль и стандарты кодирования C/С++", пункт 2.3).
Кроме того, избегая использования #define для определения констант и использования const, вы повышаете безопасность своего кода. Руководства по программированию на С++ - пункт 2.1
Ответ 6
Контрактный аспект const также важен для оптимизатора компилятора. При определенных объявлениях const оптимизация с использованием инвариантов цикла проще для оптимизатора. Вот почему const_cast действительно опасен.