Je vais parler de C ++, où cette différence est la plus pertinente.
Comme vous le constatez correctement, immuable signifie qu'un objet ne peut pas changer du tout après sa création. Cette création peut bien sûr se produire au moment de l'exécution, c'est-à-dire qu'un const
objet n'est pas nécessairement une constante au moment de la compilation. En C ++, un objet est immuable si (1) et (2) ou (3) sont respectés:
Il n'a pas de membres déclarés mutable
qui sont mutés par const
les fonctions membres
Il est déclaré const
const
les fonctions membres n'utilisent pas const_cast
pour supprimer la const
qualification afin de muter des membres
Cependant, vous pouvez également envisager des modificateurs d'accès: si une opération mute en interne une instance, mais n'a aucun effet sur l'état de l'instance observable via son interface publique, alors l'objet est «logiquement immuable».
C ++ fournit donc les outils nécessaires pour créer des objets immuables, mais comme la plupart des éléments en C ++, les outils ne sont que très peu suffisants et nécessitent une diligence pour être réellement utilisés. L'état d'une instance n'est pas nécessairement limité aux variables membres de l'instance - car C ++ ne fournit pas un moyen d'imposer la transparence référentielle, il peut également inclure un état global ou de classe.
const
a également une autre fonction en C ++: qualifier les références et les pointeurs. Une const
référence peut faire référence à un non- const
objet. Il est légal (mais pas généralement nécessaire ou conseillé) d'utiliser const_cast
pour muter un objet via une const
référence, si et seulement si cet objet est déclaré non const
:
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
Et bien sûr, c'est un comportement indéfini de muter un const
objet:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
const
n'existe pas dans toutes les langues, et la mutabilité et l'immuabilité n'existent pas dans toutes les langues, donc rendre ce langage agonistique n'est pas applicable. Il est spécifique au langage uniquement lorsque ces concepts s'appliquent.