Функции постоянных членов - PullRequest
9 голосов
/ 14 января 2011

После прочтения этого я понимаю, что объявление метода как const предотвращает случайное изменение переменных-членов класса.

  • Являются ли методы const обычнымиused?
  • Должны ли они использоваться для всего , которое не должно изменять переменные-члены?

Ответы [ 8 ]

14 голосов
/ 14 января 2011

Да, const всегда следует использовать, когда это необходимо.

Это позволяет вашему компилятору проверять логику приложения, статически утверждая const-правильность бесплатно!

Некоторые люди даже говорят, что const должно быть по умолчанию, и вы должны быть вынуждены использовать mutable для того, что непостоянно.

6 голосов
/ 14 января 2011

Я широко использую const, чтобы сообщить о намерениях дизайнера. Если бы я предполагал, что метод является чистым запросом, а не функцией модификации, я бы и применял это, и сообщал бы его с помощью «const» в сигнатуре.

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

4 голосов
/ 14 января 2011

Только мое свидетельство.

Несколько лет назад я все еще был против использования const, просто из-за ограничений в дизайне и написании более длинных сигнатур функций ... и так далее ...

Но один из моих руководителей проектов всегда настаивал, все время напоминая мне: «Вы должны использовать функцию const, это позволяет избежать несчастных случаев и делать бессмысленные действия».

И однажды я столкнулся с ошибкой невозможно найти. День за днем, день за днем ​​... Кошмар. Дизайн был слишком велик для меня, чтобы я мог понять его целиком. Я тщетно искал, пока не решил, что потерян.

Затем я потратил два дня на переопределение ВСЕХ функций, которые должны быть . Я имею в виду, два дня. (Перекомпиляции были длинны, поскольку это был проект из 5 миллионов строк кода).

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

Теперь иногда я забываю поставить const. Но если я это замечаю, я исправляю это.

1 голос
/ 14 января 2011

Вы должны использовать ключевое слово const всякий раз, когда это возможно.

Это предотвратит вас от ошибок в коде.

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

1 голос
/ 14 января 2011

Если у вас есть константная ссылка или указатель (т. Е. Указатель на const) объекта класса, то вы можете ТОЛЬКО вызывать методы-члены const класса.

Так что если кто-то "забыл" сделать метод "get" const, вы не сможете вызывать его с помощью ссылки на const (есть обходной путь с const_cast, но мы не хотим его использовать!) 1003 *

Так что да, если класс не будет изменен методом, тогда он должен быть постоянным.

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

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

1 голос
/ 14 января 2011

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

1 голос
/ 14 января 2011

Объявление метода, который не должен изменять переменные-члены:

  1. Гарантирует, что вы думаете, что происходит, то есть, что вы случайно не модифицировали переменную где-то.
  2. Объявляет вызывающим функции, что этот метод не изменяет переменные-члены, избавляя от необходимости читать код или полагаться на документацию, которая так говорит.

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

1 голос
/ 14 января 2011

Добавление const к функции-члену позволяет вызывать ее при постоянных ссылках на объект, поскольку гарантирует, что переменные экземпляра не будут изменены. Ссылки на const встречаются в разных местах по всему STL, поэтому имеет смысл помечать функции-члены как const, где функция не предназначена для изменения состояния объекта.

Примечание: некоторые переменные экземпляра можно пометить как mutable, чтобы их можно было изменить даже с помощью константных функций. Это полезно для реализации поискового кэша, например.

...