Verinize Kim Dokunabilir
İlk sınıfınızı yazdığınızda muhtemelen her üyeyi dış dünyaya açtınız. Bu işe yarar, ama sınıfların var olma sebeplerinden birini çöpe atar: kapsülleme - bir sınıfın iç durumunu gizleyerek programın geri kalanının onunla yalnızca denetimli bir yüzey üzerinden etkileşmesini sağlamak. Erişim belirleyicileri, bu sınırı çizme şeklinizdir.
Tam olarak üç tane vardır: public, private ve protected. Her biri kendisinden sonra gelen üyeleri etiketler ve etiket, hangi kodun onları okuyabileceğine veya yazabileceğine karar verir. Bunu doğru yaparsanız sınıfınız kendi kurallarını uygular; yanlış yaparsanız herhangi bir yerdeki herhangi bir hata nesnenizin durumunu bozabilir.
Üç Belirleyici
Bir belirleyici, iki nokta üst üste ile takip edilen bir anahtar sözcüktür. Ondan sonra bildirilen her üye - bir sonraki belirleyiciye kadar - o erişim düzeyine girer.
Son satırın yorumunu kaldırın, derleyici derlemeyi reddeder: balance private'tır, bu yüzden main ona doğrudan dokunamaz. İşte amaç bu - bakiyeyi değiştirmenin tek yolu deposit'tir, bu da ileride doğrulamayı (negatif yatırım yok, kayıt, limitler) tek bir yerde ekleyip her zaman uygulandığına güvenebileceğiniz anlamına gelir.
İşte tam dökümü:
// şuradan erişilebilir...
// public her yerden (nesneye sahip herhangi bir kod)
// private yalnızca sınıfın kendi üyeleri (+ friend'ler)
// protected sınıfın kendi üyeleri VE türetilmiş sınıflar (+ friend'ler)
class ve struct: Varsayılan
İstediğiniz kadar belirleyici bloğunu istediğiniz sırada yazabilirsiniz. İlkini yazmadan önce üyelerin ne aldığı, class mı yoksa struct mı kullandığınıza bağlıdır:
- Bir
classiçinde üyeler varsayılan olarakprivate'tır. - Bir
structiçinde üyeler varsayılan olarakpublic'tir.
Bu varsayılan, iki anahtar sözcük arasındaki tek dil düzeyindeki farktır. Bir struct da tıpkı bir class gibi metotlara, kuruculara ve private bölümlere sahip olabilir.
Gelenek, salt genel verilerin oluşturduğu paketler için struct, davranış ve gizli durum istediğinizde ise class kullanmaktır - ancak derleyici bunu zorunlu kılmaz, yalnızca varsayılan farklıdır.
Getter ve Setter ile Kapsülleme
Günlük desen şudur: veriler bir private bölüme girer ve bir public metot denetimli erişim verir. Salt okunur bir getter değeri döndürür; bir setter atamadan önce doğrular. private'in işe yaradığı yer burasıdır.
celsius private olduğu için geçersiz bir değeri içeri sokmanın yolu yoktur - her yazma işleminin, değişmezi koruyan setCelsius'tan geçmesi gerekir. Getter'ların const ile işaretlendiğine dikkat edin: nesneyi değiştirmeyeceklerine söz verirler, böylece onları const Temperature nesneleri üzerinde de çağırabilirsiniz.
protected ve Kalıtım
protected, yalnızca kalıtım devreye girdiğinde önem kazanır. Dış kod için private gibi davranır, ancak bir türetilmiş sınıf ona erişebilir. Bir alt sınıfın meşru olarak ihtiyaç duyduğu ancak dışarıdakilerin hâlâ erişmemesi gereken üyeler için kullanın.
Yaygın bir acemi hatası, "belki bir alt sınıf ihtiyaç duyar diye" her veri üyesi için protected'a sarılmaktır. Bu, sınıfınızın sözleşmesini sessizce genişletir - artık her alt sınıf o alana bağımlı olabilir ve onu serbestçe değiştiremezsiniz. private'i tercih edin ve yalnızca türetilmiş bir sınıfın gerçekten erişime ihtiyacı olduğunda protected'a yükseltin.
friend Kaçış Kapısı
Bazen tek bir dış işlev veya sınıfın iç yapınızı meşru olarak görmesi gerekir - klasik bir örnek, üye yapamayacağınız << gibi bir operatördür. friend anahtar sözcüğü, o tek adlandırılmış varlığa private ve protected üyelerinize erişim verir, başka hiçbir şeye değil.
friend, bilinçli ve cerrahi bir istisnadır - sınıfın kendisi tam olarak kime güvendiğini adlandırır, böylece kimse kendisine dışarıdan erişim veremez. Onu idareli kullanın; eğer çok sayıda friend eklediğinizi fark ediyorsanız, muhtemelen üyeleriniz en baştan private olmamalıydı ya da tasarımınızın yeniden düşünülmesi gerekiyor.
Kaçınılması Gereken Yaygın Hatalar
- Her üyeyi
publicyapmak. Kolay gibi görünür, ama kapsüllemenin sağladığı tüm doğrulamayı ve değişmezleri kaybedersiniz. Varsayılan olarakprivateveriler vepublicmetotlar kullanın. classvarsayılanını unutmak.class Foo { int x; };x'i private yapar, bu yüzdenfoo.x = 5derlenmez. Eğer salt veri paketi kastettiyseniz,structkullanın veya birpublic:etiketi ekleyin.protected'i aşırı kullanmak.private'ten daha zayıf bir sınırdır ve yalnızca kalıtımla ilgilidir. Her yerde ona sarılmak, alt sınıfları değiştirmek isteyebileceğiniz alanlara bağlar.private'in bir güvenlik özelliği olmasını beklemek. Bu, kazara erişimi önleyen bir derleme zamanı kuralıdır, şifreleme değil. Baytlar hâlâ bellektedir;privatetemiz tasarımla ilgilidir, gizlilikle değil.
Sırada: Struct'lar
Artık bir struct'ın aslında yalnızca üyeleri varsayılan olarak public olan bir class olduğunu gördünüz. Sonraki sayfa, struct'lar, bu varsayılan-public davranışının tam olarak ne zaman istediğiniz şey olduğunu - ilişkili değerleri gruplamak için hafif kümeler - ve struct'ın deyimsel C++'ta tam donanımlı sınıfların yanında nasıl kullanıldığını derinlemesine inceler.
Sıkça Sorulan Sorular
C++'ta public, private ve protected arasındaki fark nedir?
public üyelere her yerden erişilebilir. private üyelere yalnızca aynı sınıfın içinden (ve onun friend'lerinden) erişilebilir. protected da private gibidir, ancak türetilmiş sınıfların da üyeye erişmesine izin verir. Geleneksel olarak verileri private tutar ve davranışı public metotlar aracılığıyla dışarı açarsınız.
C++'ta üyeler varsayılan olarak private midir?
Bir class içinde evet - bir erişim belirleyici yazana kadar her şey private'dır. Bir struct içinde ise varsayılan public'tir. Bu tek varsayılan, C++'ta class ile struct arasındaki gerçek tek farktır; her ikisi de metotlara, kuruculara ve erişim belirleyicilerine sahip olabilir.
C++'ta friend anahtar sözcüğü ne işe yarar?
friend, belirli bir işleve veya sınıfa private ve protected üyelerinize erişim verir. Kapsüllemeye bilinçli ve dar bir istisnadır - sınıf tam olarak kime güvendiğini açıkça belirtir, böylece erişim hiçbir zaman örtük olarak verilmez.