Porozmawiam z C ++, gdzie ta różnica jest najbardziej istotna.
Jak słusznie zauważysz, niezmienny oznacza, że obiekt nie może się w ogóle zmienić po jego utworzeniu. To tworzenie może oczywiście nastąpić w czasie wykonywania, tzn. const
Obiekt niekoniecznie musi być stałą czasową kompilacji. W C ++ obiekt jest niezmienny, jeśli spełnione są (1) i (2) lub (3):
Nie ma zadeklarowanych członków mutable
zmutowanych przez const
funkcje członka
Zostało zadeklarowane const
const
funkcje członków nie służą const_cast
do usuwania const
kwalifikacji w celu mutowania jakichkolwiek członków
Można jednak również rozważyć modyfikatory dostępu: jeśli operacja mutuje instancję wewnętrznie, ale nie ma wpływu na stan instancji obserwowalny przez jej publiczny interfejs, obiekt jest „logicznie niezmienny”.
Tak więc C ++ zapewnia narzędzia niezbędne do tworzenia niezmiennych obiektów, ale podobnie jak większość wszystkiego w C ++, narzędzia są tylko w minimalnym stopniu wystarczające i wymagają staranności, aby móc ich używać. Stan instancji niekoniecznie ogranicza się do zmiennych składowych instancji - ponieważ C ++ nie zapewnia sposobu wymuszania przejrzystości referencyjnej, może również obejmować stan globalny lub klasowy.
const
ma także inną funkcję w C ++: kwalifikowanie referencji i wskaźników. const
Odniesienia może odnosić się do nie- const
przedmiotu. Używanie const_cast
do mutowania obiektu za pomocą const
odwołania jest legalne (choć nie jest to generalnie konieczne lub wskazane) , i tylko wtedy , gdy obiekt ten jest zadeklarowany jako inny niż const
:
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
I oczywiście mutowanie const
obiektu jest niezdefiniowane :
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
const
nie istnieje w każdym języku, a zmienność i niezmienność nie istnieje w każdym języku, więc sprawienie, by ten język był agonistyczny, nie ma zastosowania. Jest on specyficzny dla języka tylko wtedy, gdy te pojęcia mają zastosowanie.