Parlerò in C ++, dove questa differenza è più rilevante.
Come noterai correttamente, immutabile significa che un oggetto non può cambiare affatto dopo la sua creazione. Questa creazione può ovviamente avvenire in fase di esecuzione, ovvero un constoggetto non è necessariamente una costante di compilazione. In C ++, un oggetto è immutabile se sono soddisfatti (1) e (2) o (3):
Non ha membri dichiarati mutablemutati dalle constfunzioni dei membri
È dichiarato const
constle funzioni membro non vengono utilizzate const_castper rimuovere la constqualifica al fine di mutare qualsiasi membro
Tuttavia, potresti anche prendere in considerazione i modificatori di accesso: se un'operazione muta internamente un'istanza, ma non ha alcun effetto sullo stato dell'istanza osservabile attraverso la sua interfaccia pubblica, l'oggetto è "logicamente immutabile".
Quindi C ++ fornisce gli strumenti necessari per creare oggetti immutabili, ma come la maggior parte di tutto in C ++, gli strumenti sono solo minimamente sufficienti e richiedono diligenza per essere effettivamente utilizzati. Lo stato di un'istanza non è necessariamente limitato alle variabili dei membri dell'istanza, poiché C ++ non fornisce un modo per applicare la trasparenza referenziale, ma può includere anche lo stato globale o di classe.
constha anche un'altra funzione in C ++: qualificare riferimenti e puntatori. Un constriferimento può riferirsi a un non constoggetto. È legale (anche se generalmente non necessario o consigliabile) utilizzare const_castper mutare un oggetto attraverso un constriferimento, se e solo se l' oggetto è dichiarato non const:
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
E ovviamente è un comportamento indefinito mutare un constoggetto:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
constnon esiste in tutte le lingue e la mutabilità e l'immutabilità non esistono in tutte le lingue, quindi rendere questa lingua agonistica non è applicabile. È specifico della lingua solo dove si applicano questi concetti.