Parlerò con C ++, dove questa differenza è più rilevante.
Come si nota correttamente, immutable significa che un oggetto non può cambiare affatto dopo la sua creazione. Questa creazione può naturalmente verificarsi in fase di esecuzione, ad esempio, un oggetto const
non è necessariamente una costante in fase di compilazione. In C ++, un oggetto è immutabile se (1) e uno (2) o (3) sono soddisfatti:
-
Non ha membri dichiarati mutable
che sono mutati da const
funzioni membro
-
È dichiarato const
Le funzioni membro -
const
non utilizzano const_cast
per rimuovere la qualifica const
al fine di mutare i membri
Tuttavia, potresti anche considerare i modificatori di accesso: se un'operazione esegue la mutua di un'istanza internamente, 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 l'uso effettivo. Lo stato di un'istanza non è necessariamente limitato alle variabili membro di istanza, poiché il C ++ non fornisce un modo per applicare la trasparenza referenziale, ma può anche includere lo stato globale o di classe.
const
ha anche un'altra funzione in C ++: per qualificare riferimenti e puntatori. Un riferimento const
può riferirsi a un oggetto% nonconst
. È legale (anche se non generalmente necessario o consigliabile) usare const_cast
per mutare un oggetto attraverso un riferimento const
, se e solo se quell'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 non definito per mutare un oggetto const
:
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.