mutable
- C++ kursu
- Orta seviye
- Ders 27/116
- 5 dk
mutable ile const içinde değişebilen üye öğrenirsin.
mutable
Bazen const bir metot içinde bir üyeyi değiştirmen gerekir; ama nesnenin mantıksal durumunu değiştirmek istemezsin. Örneğin bir önbellek (cache) sayacı. Böyle durumlarda üyeyi mutable yaparsın. mutable bir üye, const metot içinde bile değiştirilebilir.
Örnek: class Query { private: mutable int cacheHits; public: int run() const { cacheHits++; return 42; } };. Burada run metodu const'tür; nesneyi değiştirmez. Ama cacheHits mutable olduğu için artırılabilir. Bu, performans izleme gibi yan etkileri mümkün kılar. Mantıksal durum aynı kalırken uygulama düzeyinde değişiklik yapılabilir.
Önbellek kullanımı
mutable'ın en yaygın kullanımı önbellektir (cache). Pahalı bir hesaplama varsa, sonucu saklayıp tekrar hesaplamaktan kaçınırsın. Hesaplayan metot const olabilir; çünkü mantıksal sonuç değişmez.
Örnek: class Config { private: mutable bool cached; mutable int cachedValue; public: int getValue() const { if (!cached) { cachedValue = 42; cached = true; } return cachedValue; } };. İlk çağrıda değer hesaplanır ve önbelleğe alınır; sonraki çağrılarda önbellekten döndürülür. getValue const'tür ama cached ve cachedValue mutable olduğu için değiştirilebilir. Bu, şeffaf önbellekleme sağlar.
Uygulama Counter sınıfına mutable üye ekle
Counter sınıfını tanımla. private: altına int value; ve mutable int reads; üye değişkenleri ekle. public: altına Counter() { value = 0; reads = 0; } yapıcı ve int get() const { reads++; return value; } metodu ekle. main içinde bir örnek oluştur, get()'i iki kez çağır ve std::cout ile ikinci get()'in sonucunu yazdır.
Başlangıç kodu
#include <iostream>
// Counter sınıfını tanımla
int main() {
// Counter örneği oluştur, get çağır ve sonucu yazdır
return 0;
}Örnek çözüm
#include <iostream>
class Counter {
int value;
mutable int reads;
public:
Counter() {
value = 0;
reads = 0;
}
int get() const {
reads++;
return value;
}
};
int main() {
Counter c;
c.get();
std::cout << c.get();
return 0;
}Beklenen çıktı
0
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 mutable üye nerede değiştirilebilir?
mutable int cacheHits;- Yalnızca const metotlar içinde Doğru cevap
- Her türlü metot içinde
- Yalnızca yapıcı içinde
- Hiçbir yerde değiştirilemez
Açıklama: mutable üye const metotlar içinde de değiştirilebilir.
2 mutable anahtar kelimesini yaz
private: ____ int cacheHits;
private: mutable int cacheHits;
Açıklama: mutable, const metot içinde değişime izin verir.
3 Anahtar kelimeyi kullanımına eşle
| Kavram | Anlamı |
|---|---|
mutable |
const içinde değişir |
const |
Nesneyi değiştirmez |
private |
Sınıf içi erişim |
mutable int cache |
Önbellek üyesi |