Soru Tarihi:
Kapsülleme, C++'ın ortaya çıkmasından bu yana OOP'nin en önemli ilkelerinden biridir. Amaç, bir nesnenin iç durumuna erişimi sınırlamak ve bunlarla çalışmak için yalnızca düşünülmüş arayüzler sunmaktır. C++'da kapsülleme, sınıf üyelerinin erişim alanları (public, protected, private) aracılığıyla biçimlendirilmiştir.
Sorun:
Eğer kapsülleme kullanılmazsa, nesnelerin iç durumu programın herhangi bir yerinden değiştirilebilir; bu durum hatalara, zor tespit edilen bug'lara ve genel güvenilirlik düşüşüne yol açar. Aşırı kapatma ise sınıfların bakımını ve kullanılmasını zorlaştırabilir.
Çözüm:
Sınıfın arayüzünü (public bölüm) ve uygulamasını (private/protected) net bir şekilde ayırmak gerekir. Önemli verilere erişim için özel yöntemler (getter/setter) kullanmalısınız. Karmaşık mantık için mekanizmayı ek sınıflar veya şablonlar aracılığıyla ayırmalısınız. Durumun değişmezliğini sağlamak için const yöntemlerini kullanmalısınız.
Kod örneği:
class Counter { private: int value; public: Counter() : value(0) {} void increment() { ++value; } int get() const { return value; } };
Anahtar özellikler:
Diğer nesnenin private üyesine doğrudan erişim sağlanabilir mi?
Evet, sınıfın yöntemleri içinde, aynı sınıfın diğer nesnelerinin private üyelerine erişmek mümkündür.
class Example { int val; public: void copyVal(const Example& other) { val = other.val; } // Hata yok! };
Arkadaş fonksiyonu sınıfın private üyelerine erişebilir mi?
Evet, friend fonksiyonu sınıfın private/protected üyelerine tam erişim hakkına sahiptir.
Kapsayıcıyı private yapmak mümkün mü? Bunu neden yaparız?
Evet, private yapıcılar genellikle singleton'lar ve fabrika yöntemleri için sınıf örneklerinin oluşturulmasını kontrol etmek amacıyla kullanılır.
BankAccount sınıfı public değişken balance içerir. Herhangi bir dış kod, doğrudan bakiyeyi değiştirebilir ve bu durum hataları neredeyse imkansız hale getirir.
Artılar:
Eksiler:
Balance değişkeni gizlidir, yalnızca anlaşılabilir yöntemler ile değişimin yapılmasına izin verilir. Kontroller sınıf içinde uygulanmıştır.
Artılar:
Eksiler: