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 const
oggetto non è necessariamente una costante di compilazione. In C ++, un oggetto è immutabile se sono soddisfatti (1) e (2) o (3):
Non ha membri dichiarati mutable
mutati dalle const
funzioni dei membri
È dichiarato const
const
le funzioni membro non vengono utilizzate const_cast
per rimuovere la const
qualifica 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.
const
ha anche un'altra funzione in C ++: qualificare riferimenti e puntatori. Un const
riferimento può riferirsi a un non const
oggetto. È legale (anche se generalmente non necessario o consigliabile) utilizzare const_cast
per mutare un oggetto attraverso un const
riferimento, 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 const
oggetto:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
const
non 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.