Hablaré con C ++, donde esta diferencia es más relevante.
Como observa correctamente, inmutable significa que un objeto no puede cambiar en absoluto después de su creación. Por supuesto, esta creación puede ocurrir en tiempo de ejecución, es decir, un const
objeto no es necesariamente una constante de tiempo de compilación. En C ++, un objeto es inmutable si se cumplen (1) y (2) o (3):
No tiene miembros declarados mutable
que estén mutados por const
funciones miembro
Se declara const
const
las funciones de miembro no se utilizan const_cast
para eliminar la const
calificación con el fin de mutar a cualquier miembro
Sin embargo, también podría considerar modificadores de acceso: si una operación muta internamente una instancia, pero no tiene ningún efecto sobre el estado de la instancia observable a través de su interfaz pública, entonces el objeto es "lógicamente inmutable".
Por lo tanto, C ++ proporciona las herramientas necesarias para crear objetos inmutables, pero como la mayoría de todo en C ++, las herramientas son mínimamente suficientes y requieren diligencia para su uso real. El estado de una instancia no se limita necesariamente a las variables miembro de la instancia, ya que C ++ no proporciona una forma de imponer la transparencia referencial, también puede incluir el estado global o de clase.
const
También tiene otra función en C ++: calificar referencias y punteros. Una const
referencia puede referirse a un no const
objeto. Es legal (aunque generalmente no es necesario o aconsejable) usar const_cast
para mutar un objeto a través de una const
referencia, si y solo si ese objeto se declara no const
:
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
Y, por supuesto, es un comportamiento indefinido mutar un const
objeto:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
const
no existe en todos los idiomas, y la mutabilidad e inmutabilidad no existe en todos los idiomas, por lo que hacer que este lenguaje sea agonístico no es aplicable. Es específico del idioma solo donde se aplican estos conceptos.