ejemplos descargar definicion compiler caracteristicas c++

c++ - descargar - diferencia entre constancia lógica y física



c++ manual (3)

¿Cuál es la diferencia entre estos dos términos, y por qué necesito mutable ?


La constness "física" proviene de la declaración de constancia de un objeto y, en principio, podría imponerse colocando el objeto en la memoria de solo lectura, por lo que no puede cambiar. Intentar cambiarlo causará un comportamiento indefinido; puede cambiar, o puede que no, o puede desencadenar una falla de protección, o puede fundir el chip de memoria.

La constancia "lógica" viene de declarar una referencia o una const puntero, y es aplicada por el compilador. El objeto en sí puede o no puede ser "físicamente" constante, pero la referencia no se puede utilizar para modificarlo sin una conversión. Si el objeto no es "físicamente" const, entonces C ++ le permite modificarlo, usando const_cast para evitar la protección.

Un miembro de clase mutable se puede modificar incluso si el objeto de clase en sí (o la referencia o el puntero utilizado para acceder a él) es const . Ejemplos de buenos usos de esto son un mutex que se debe bloquear durante una operación de lectura y un caché para almacenar el resultado de una operación de lectura costosa. En ambos casos, la operación en sí misma debe ser una función const (ya que no afecta el estado visible del objeto), pero necesita modificar el mutex o el caché, por lo que estos deben ser mutable . También se puede abusar para hacer que el objeto cambie visiblemente cuando, lógicamente, no debería, así que utilícelo con cuidado; solo declare que los miembros son mutable si no forman parte del estado visible externamente.


Necesita ser mutable cuando hay campos en un objeto que pueden considerarse "internos", es decir, cualquier usuario externo de la clase no puede determinar el valor de estos campos. Es posible que la clase deba escribir en estos campos aunque la instancia se considere constante, es decir, no cambie.

Considere un disco duro; Su caché es un ejemplo de tal estado. La memoria caché se escribe cuando los datos se leen desde el disco real.

Esto no es posible expresar de forma limpia en C ++ sin hacer que los miembros correspondientes sean mutable , para permitir que se cambien incluso en los métodos marcados como const . Como se señaló en un comentario, siempre puedes alcanzar el martillo y usar const_cast<> para eliminar la constancia, pero eso es, por supuesto, hacer trampa. :)


Scott Meyers, Effective C ++ , Item 3:

Use const siempre que sea posible

Tiene una excelente discusión (con ejemplos) sobre este tema. Es difícil escribir mejor que Scott!

Tenga en cuenta también que la constancia física también se conoce como constancia a nivel de bits.