Soru geçmişi:
C++'da const niteliği, güvenlik amacıyla ortaya çıkmıştır: nesnenin iç durumunu kesinlikle değiştirmeyen fonksiyonları belirtmek için. Sınıflar bağlamında, const-yöntemler, sıkı kapsülleme ve tesadüfi hatalardan koruma gereksinimi olan projeler için zorunludur.
Sorun:
Eğer getter'lar, yardımcı fonksiyonlar ve kontrol metodları const olarak işaretlenmeyi unutulursa, bunlar const-n nesneleri için çağrılamaz. Const-yöntemler olmadan derleyici, istenmeyen veri değişikliklerini önleyemez.
Çözüm:
Sınıf yönteminin bildirimine, imza sonrasında (değil öncesinde!) const eklenmesi gerektiği Bu, yöntemin hem normal hem de const olarak tanımlanmış nesneler için çağrılmasına olanak tanır ve durum değişikliklerine karşı hataları ortadan kaldırır. Bu tür bir yöntem içinde, sınıf üyelerini (mutable dışında) değiştirmek mümkün değildir, yalnızca okuma erişimi sağlanır.
Kod örneği:
class Counter { int value; public: int getValue() const { return value; } // const Counter için çağrılabilir }; void print(const Counter& c) { std::cout << c.getValue(); }
Ana özellikler:
Yöntem için const nerede yazılır: döndürülen değerin önünde mi yoksa parantezlerin arkasında mı?
Yalnızca parantezlerin arkasında: int getValue() const; — döndürülen türün önünde yazmak hata (örneğin, const int get();).
Const-yöntem, sınıfın non-const yöntemlerini çağırabilir mi?
Hayır, const-yöntem yalnızca diğer const-yöntemleri çağırabilir, eğer nesne const ise.
Yöntemdeki const ile döndürülen değerdeki const arasındaki fark nedir?
int get() const (metot durumu değiştirmiyor)
const int get(); (döndürülen değer değiştirilemez, ancak metot iç verileri değiştirebilir)
Sınıfta durumu değiştirmeyen bir yöntem için const atlanmıştır. Bu, sabit bir nesne için çağrılamaz, analiz araçları ve API ile çalışmada sınıfın kullanılmasını Engeller.
Artılar:
Eksiler:
Tüm getter'lar, kontroller ve yardımcı yöntemler const ile tanımlanmıştır, testler const ve non-const nesneler için kapsanmıştır.
Artılar:
Eksiler: