Разница между логическим и физическим постоянством - PullRequest
22 голосов
/ 30 сентября 2010

В чем разница между этими двумя терминами и зачем мне нужно mutable?

Ответы [ 3 ]

37 голосов
/ 30 сентября 2010

«Физическая» константа происходит от объявления объекта const, и, в принципе, может быть реализована путем помещения объекта в постоянную память, поэтому он не может измениться. Попытка изменить его приведет к неопределенному поведению; оно может измениться, или нет, или вызвать ошибку защиты, или расплавить микросхему памяти.

«Логическая» константа происходит от объявления ссылки или указателя const и применяется компилятором. Сам объект может быть или не быть «физически» постоянным, но ссылка не может быть использована для его изменения без приведения. Если объект не является «физически» постоянным, то C ++ позволяет вам изменить его, используя const_cast для обхода защиты.

Член класса mutable можно изменить, даже если сам объект класса (или ссылка или указатель, использованный для доступа к нему) равен const. Примеры хорошего использования этого - мьютекс, который должен быть заблокирован во время операции чтения, и кэш для хранения результата дорогостоящей операции чтения. В обоих случаях сама операция должна быть функцией const (поскольку она не влияет на видимое состояние объекта), но она должна изменить мьютекс или кэш, поэтому они должны быть mutable. Также можно злоупотреблять, чтобы заставить объект заметно измениться, когда это логически не следует, поэтому используйте его с осторожностью; объявлять элементы mutable только в том случае, если они не являются частью видимого извне состояния.

17 голосов
/ 30 сентября 2010

Вам нужно mutable, когда в объекте есть поля, которые можно считать «внутренними», т.е. любой внешний пользователь класса не может определить значение этих полей.Классу может потребоваться запись в эти поля, даже если экземпляр считается постоянным, то есть не изменяется.

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

Это невозможно выразить в чистом виде в C ++ без создания соответствующих членов mutableразрешить их изменение даже в методах, помеченных const.Как указано в комментарии, вы всегда можете достать молоток и использовать const_cast<>, чтобы удалить const -несс, но это, конечно, обман.:)

1 голос
/ 30 сентября 2010

Скотт Мейерс, Эффективный C ++ , пункт 3:

Использование const везде, где это возможно

провел отличное обсуждение (с примерами) по этой теме.Трудно писать лучше, чем Скотт!

Обратите внимание, что физическая константность также известна как битовая константность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...