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 const
nesnenin 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 mutable
tarafı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_cast
kaldı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.
const
ayrıca C ++ 'da başka bir işlevi vardır: referansları ve işaretçileri nitelemek için. Bir const
referans olmayan bir const
nesneye atıfta bulunabilir . Kullanımı (genellikle gerekli olmasa da ya önerilir) yasal const_cast
bir içinden bir nesneyi mutasyona const
referans 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 const
nesneyi 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.
const
her 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 .