Подтвердить что ты не робот

Преимущества const в С++?

В чем преимущества const в С++ (и C) для непосвященных?

4b9b3361

Ответ 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 действительно опасен.