IMHO, jawaban yang ada melakukan pekerjaan yang buruk menjelaskan "Mengapa" ini - terlalu berfokus pada mengulangi perilaku apa yang valid. "pengubah akses bekerja pada tingkat kelas, dan bukan pada tingkat objek." - iya tapi kenapa?
Konsep menyeluruh di sini adalah bahwa programmer merancang, menulis dan memelihara kelas yang diharapkan untuk memahami enkapsulasi OO yang diinginkan dan diberdayakan untuk mengoordinasikan implementasinya. Jadi, jika Anda menulis class X
, Anda menyandikan tidak hanya bagaimana sebuah X x
objek dapat digunakan oleh kode yang memiliki akses ke sana, tetapi juga bagaimana:
- kelas turunan dapat berinteraksi dengannya (melalui fungsi virtual opsional-murni dan / atau akses terlindungi), dan
X
objek yang berbeda bekerja sama untuk memberikan perilaku yang dimaksudkan sambil menghormati kondisi pasca dan invarian dari desain Anda.
Ini bukan hanya konstruktor salinan - banyak sekali operasi yang dapat melibatkan dua atau lebih contoh kelas Anda: jika Anda membandingkan, menambah / mengalikan / membagi, menyalin-membangun, mengkloning, menetapkan, dll. Maka sering kali Anda baik hanya harus memiliki akses ke data pribadi dan / atau dilindungi di objek lain, atau ingin memungkinkan implementasi fungsi yang lebih sederhana, lebih cepat, atau secara umum lebih baik.
Secara khusus, operasi ini mungkin ingin memanfaatkan akses pribadi untuk melakukan hal-hal seperti:
- (menyalin konstruktor) menggunakan anggota pribadi dari objek "rhs" (sisi kanan) dalam daftar penginisialisasi, sehingga variabel anggota itu sendiri dibuat-salinan alih-alih dibangun secara default (jika legal) kemudian ditetapkan juga (sekali lagi, jika legal)
- berbagi sumber daya - pegangan file, segmen memori bersama,
shared_ptr
ke data referensi, dll.
- mengambil kepemilikan atas sesuatu, misalnya
auto_ptr<>
"memindahkan" kepemilikan ke objek yang sedang dibangun
- salin "cache" pribadi, kalibrasi, atau anggota status yang diperlukan untuk membuat objek baru dalam keadaan yang dapat digunakan secara optimal tanpa harus membuat ulang dari awal
- menyalin / mengakses diagnostik / melacak informasi yang disimpan dalam objek yang sedang disalin yang tidak dapat diakses melalui API publik tetapi mungkin digunakan oleh beberapa objek pengecualian atau pencatatan nanti (misalnya sesuatu tentang waktu / keadaan ketika instance "asli" yang tidak dibuat salinannya dibangun)
- melakukan penyalinan yang lebih efisien dari beberapa data: misalnya objek mungkin memiliki misalnya
unordered_map
anggota tetapi secara publik hanya mengekspos begin()
dan end()
iterator - dengan akses langsung ke size()
Anda dapat reserve
kapasitas untuk menyalin lebih cepat; lebih buruk lagi jika mereka hanya mengekspos at()
dan insert()
dan sebaliknya throw
....
- salin referensi kembali ke objek induk / koordinasi / manajemen yang mungkin tidak diketahui atau hanya-tulis untuk kode klien