Ничего нового, просто ссылки:
- http://www.parashift.com/c++-faq/const-correctness.html - разные аспекты
- http://www.cprogramming.com/tutorial/const_correctness.html - для чего нужно и почему, а так же логическая и побитовая константность.
Если коротко, то что даёт применение ключевого слова const
везде, где это уместно:
<WRAP center round tip 60%>
- Уберегает вас от некоторых ошибок, связанных с внезапным изменением данных в каких-то вызовых. Т.е. добавляет безопасности.
- Автодокументирование кода: вы выдите const => вы знаете, что данные не меняются ни в этом вызове, ни далее по иерархии.
Побитовая константность - когда при вызове ни один бит структуры или класса не меняется.
Логическая константность - когда при вызове какие-то поля могут меняться, но данные, отвечающие за логику класса не изменяются.
Обычно последнее связано с полями, которые имеют спецификатор mutable
. Для чего они нужны? Самый простой пример: экземпляр класса может использоваться из разных потоков. Писать может один поток, а читать другой. Логично, что метод для чтения будет константным. Так же логично, что чтение и запись следует защитить мьютексом. Но если мы попробуем заблокировать мьютекс в константном методе, получис ошибку компиляции. Понятно, что изменение мьютекса никак не влияет на логическую константность класса, поэтому его можно объявить mutable
и спокойно защищать им данные.
Из примера выше можно сделать такое неформальное заключение: <WRAP center round tip 60%> Побитовая константностью - неиболее сильная. Логическая - более слабая.