ProgramlamaSistem/C++ Geliştiricisi

C++'daki 'mutable', 'volatile' ve 'const' anahtar kelimeleri arasındaki farkları anlatın. Ne için kullanılırlar, yanlış kullanımında hangi tipik hatalar ortaya çıkar?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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.

Kod Örneği

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 */ } }

Kandırmaca Soru

«Bir sınıf üyesini aynı anda hem const hem de mutable olarak tanımlarsak ne olur?»

Cevap: Bunu yapmak mümkün değildir, bunlar birbirini dışlayan niteliklerdir; derleyici hata verecektir.


Konunun inceliklerini bilmemekten kaynaklanan gerçek hatalardan örnekler.


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 int ile değiştirilince teşhis edilebildi.


Hikaye

Bir kayıt sınıfı, çağrı sayısını güncellemesi gereken log() const metoduna sahipti. Başlangıçta const_cast iş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 şekilde mutable ile tanımlanmasıyla yok oldu.


Hikaye

_Bazı sınıf yöntemleri const olarak 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. mutable kullanmak veya tasarımı değiştirmek gerekiyordu.