const derleyiciye değişkenin değişmez olduğunu (başlatıldıktan sonra değiştirilemeyeceğini) bildirir. Sabit değişkenleri tanımlamak için ve nesnenin durumunu değiştirmeyen metodlar için kullanılır.
mutable sınıfın bir alanının, const metotlar içinde bile değiştirilebilmesine olanak tanır.
volatile derleyiciye değişkenin değerinin programın kontrolü dışında (örneğin, donanım tarafından) değiştirilebileceğini bildirir ve derleyicinin ona yapılan erişimleri optimize etmemesi gerektiğini belirtir.
class Logger { public: void log() const { ++count; // Geçerli - count mutable olarak tanımlandı } private: mutable int count = 0; }; volatile int flag; void wait() { while (flag == 0) { /* derleyici döngüyü optimize etmez, çünkü flag volatile */ } }
«Bir sınıf üyesini aynı anda hem
consthem demutableolarak tanımlarsak ne olur?»
Cevap: Bunu yapmak mümkün değildir, bunlar birbirini dışlayan niteliklerdir; derleyici hata verecektir.
Hikaye
Endüstriyel yazılımda donanımla çalışmak için geliştirici, harici kesmelerle güncellenen verileri normal int olarak tanımladı. Derleyici optimizasyonu, bu değişkenlerden tekrar tekrar okuma işlemlerini kaldırdı ve bu yüzden program sonsuz bir döngüde "takıldı". Problem ancak
volatile intile değiştirilince teşhis edilebildi.
Hikaye
Bir kayıt sınıfı, çağrı sayısını güncellemesi gereken
log() constmetoduna sahipti. Başlangıçtaconst_castişaretçisi kullanılarak yapıldı, bu da birçok uyarıya ve anlaşılması zor hatalara yol açtı. Sorun, sayacın düzgün bir şekildemutableile tanımlanmasıyla yok oldu.
Hikaye
_Bazı sınıf yöntemleri
constolarak tanımlandı, ancak gösterim türündeki üyeler değiştirildi (örneğin önbellekleme uygulamak için). Bu, "const-correctness" mantığının ihlaline ve nesne gerçekten okunamaz alanda yerleştirildiğinde UB'ye neden oldu.mutablekullanmak veya tasarımı değiştirmek gerekiyordu.