IMHO, mevcut cevaplar bunun "Nedenini" açıklamakta yetersiz kalıyor - hangi davranışın geçerli olduğunu yinelemeye çok fazla odaklanarak. "erişim değiştiriciler nesne düzeyinde değil, sınıf düzeyinde çalışır." - Evet ama neden?
Buradaki kapsayıcı kavram, bir sınıfı tasarlayan, yazan ve sürdüren programcı (lar) ın, istenen ve uygulanmasını koordine etmek için yetkilendirilmiş OO kapsüllemesini anlaması beklenen (s) olmasıdır. Yani, yazıyorsanız class X
, yalnızca tek bir X x
nesnenin ona erişimi olan kod tarafından nasıl kullanılabileceğini değil, aynı zamanda nasıl kullanılacağını da kodluyorsunuz :
- türetilmiş sınıflar onunla etkileşim kurabilir (isteğe bağlı olarak saf sanal işlevler ve / veya korumalı erişim yoluyla) ve
- farklı
X
nesneler , tasarımınızdaki post-koşulları ve değişmezleri onurlandırırken amaçlanan davranışları sağlamak için işbirliği yapar.
Bu sadece kopya oluşturucu da değil - çok sayıda işlem sınıfınızın iki veya daha fazla örneğini içerebilir: karşılaştırma, ekleme / çarpma / bölme, kopyalama-oluşturma, klonlama, atama vb. ya sadece diğer nesnedeki özel ve / veya korunan verilere erişime sahip olmalı ya da daha basit, daha hızlı ya da genel olarak daha iyi bir işlev uygulamasına izin vermesini istemelidir.
Özellikle, bu işlemler aşağıdakiler gibi şeyler yapmak için ayrıcalıklı erişimden yararlanmak isteyebilir:
- (kopya oluşturucular) bir başlatıcı listesindeki "rhs" (sağ taraf) nesnesinin özel bir üyesini kullanır, böylece bir üye değişkeni varsayılan olarak yapılandırılmış (yasal olsa bile) yerine kopyalanarak yapılandırılır ve sonra da atanır (yine, yasal ise)
- kaynakları paylaş - dosya tanıtıcıları, paylaşılan bellek bölümleri,
shared_ptr
referans verilere vb.
- şeylerin sahipliğini almak, örneğin
auto_ptr<>
sahipliği yapım aşamasındaki nesneye "taşımak"
- yeni nesneyi sıfırdan yeniden oluşturmak zorunda kalmadan en iyi şekilde kullanılabilir durumda oluşturmak için gereken özel "önbellek", kalibrasyon veya durum üyelerini kopyalayın
- kopyalanmakta olan nesnede tutulan tanılama / izleme bilgilerini kopyala / bunlara erişim, aksi halde genel API'ler aracılığıyla erişilemez, ancak daha sonraki bir istisna nesnesi veya günlüğe kaydetme tarafından kullanılabilir (örneğin, "orijinal" kopyalanmamış olan "orijinal" kopyalanmamış örneğin zaman / koşullar hakkında bir şey inşa edildi)
- bazı verilerin daha verimli bir kopyasını gerçekleştirin: örneğin, nesneler örneğin bir
unordered_map
üyeye sahip olabilir, ancak yalnızca kamuya açık begin()
ve end()
yineleyiciler olabilir - size()
size doğrudan erişim ile reserve
daha hızlı kopyalama kapasitesi olabilir ; daha da kötüsü onlar sadece teşhir eğer at()
ve insert()
aksi ve throw
....
- Referansları bilinmeyen veya istemci kodu için salt yazılabilen üst / koordinasyon / yönetim nesnelerine geri kopyalayın