Bu farkın en alakalı olduğu yerde C ++ ile konuşacağım.
Doğru bir şekilde not ettiğiniz gibi değişmez , bir nesnenin yaratıldıktan sonra hiçbir şekilde değişemeyeceği anlamına gelir. Bu oluşturma elbette çalışma zamanında gerçekleşebilir, yani bir constnesnenin mutlaka bir derleme zamanı sabiti olması gerekmez. C ++ 'da, (1) ve (2) veya (3) yerine getirildiğinde bir nesne değiştirilemez:
Üye işlevleri mutabletarafından değiştirildiğini bildiren hiçbir üyesi yokturconst
İlan edildi const
constüye işlevleri, herhangi bir üyeyi mutasyona uğratmak için yeterliliği const_castkaldırmak için kullanmazconst
Bununla birlikte, erişim değiştiricileri de düşünebilirsiniz: eğer bir işlem bir örneği dahili olarak değiştiriyorsa, ancak kamusal arayüzü üzerinden gözlemlenebilir olan örneğin durumunu etkilemiyorsa, nesne “mantıksal olarak değiştirilemez”.
Bu yüzden C ++ değişmez nesneler oluşturmak için gerekli araçları sağlar, ancak C ++ 'daki her şey gibi araçlar da yalnızca minimum düzeyde yeterlidir ve gerçekte kullanmaları için özen gerektirir. Bir örneğin durumu, örnek üye değişkenleriyle sınırlı değildir - C ++ referans saydamlığını zorlamak için bir yol sağlamadığından, genel veya sınıf durumunu da içerebilir.
constayrıca C ++ 'da başka bir işlevi vardır: referansları ve işaretçileri nitelemek için. Bir constreferans olmayan bir constnesneye atıfta bulunabilir . Kullanımı (genellikle gerekli olmasa da ya önerilir) yasal const_castbir içinden bir nesneyi mutasyona constreferans ve ancak eğer bu nesne olmayan bildirildi const:
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
Ve elbette bir constnesneyi mutasyona çevirmek tanımsız davranışlardır :
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
consther dilde mevcut değildir ve değişkenlik ve değişkenlik her dilde mevcut değildir, bu yüzden bu dili agonistik yapmak geçerli değildir. Sadece bu kavramların uygulandığı dile özgüdür .