Vou falar com C ++, onde essa diferença é mais relevante.
Como você notou corretamente, imutável significa que um objeto não pode ser alterado após a sua criação. É claro que essa criação pode ocorrer em tempo de execução, ou seja, um const
objeto não é necessariamente uma constante em tempo de compilação. No C ++, um objeto é imutável se (1) e (2) ou (3) forem atendidos:
Ele não possui membros declarados mutable
que são alterados por const
funções de membro
É declarado const
const
funções de membro não usam const_cast
para remover a const
qualificação, a fim de alterar qualquer membro
No entanto, você também pode considerar modificadores de acesso: se uma operação modificar internamente uma instância, mas não afetar o estado da instância observável por meio de sua interface pública, o objeto será "logicamente imutável".
Portanto, o C ++ fornece as ferramentas necessárias para criar objetos imutáveis, mas, como quase tudo no C ++, as ferramentas são minimamente suficientes e requerem diligência para realmente serem usadas. O estado de uma instância não está necessariamente confinado às variáveis de membro da instância - porque o C ++ não fornece uma maneira de impor transparência referencial, pode incluir também o estado global ou de classe.
const
também possui outra função no C ++: qualificar referências e ponteiros. Uma const
referência pode se referir a um não- const
objeto. É legal (embora geralmente não seja necessário ou aconselhável) usar const_cast
para alterar um objeto por meio de uma const
referência, se e somente se esse objeto for declarado não const
:
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
E é claro que é um comportamento indefinido modificar um const
objeto:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
const
não existe em todos os idiomas, e mutabilidade e imutabilidade não existem em todos os idiomas, portanto, tornar esse idioma agonístico não é aplicável. É específico da linguagem apenas onde esses conceitos se aplicam.