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

Разница между логической и физической константой

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

4b9b3361

Ответ 1

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

Используйте const по возможности

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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