IMHO คำตอบที่มีอยู่ทำงานได้ไม่ดีในการอธิบาย "ทำไม" ของสิ่งนี้ - เน้นย้ำมากเกินไปว่าพฤติกรรมใดถูกต้อง "ตัวปรับแต่งการเข้าถึงทำงานในระดับชั้นเรียนไม่ใช่ในระดับวัตถุ" - ใช้ แต่ทำไม?
แนวคิดที่ครอบคลุมในที่นี้คือโปรแกรมเมอร์ออกแบบเขียนและดูแลคลาสที่คาดว่าจะเข้าใจการห่อหุ้ม OO ที่ต้องการและได้รับอำนาจในการประสานการใช้งาน ดังนั้นหากคุณกำลังเขียนclass X
คุณกำลังเข้ารหัสไม่เพียง แต่วิธีการที่X x
โค้ดสามารถใช้งานวัตถุแต่ละชิ้นได้ แต่ยังรวมถึงวิธีการ:
- คลาสที่ได้รับสามารถโต้ตอบกับมันได้ (ผ่านฟังก์ชันเสมือนจริงที่เป็นทางเลือกและ / หรือการเข้าถึงที่มีการป้องกัน) และ
X
วัตถุที่แตกต่างร่วมมือกันเพื่อแสดงพฤติกรรมตามที่ตั้งใจไว้ในขณะที่ให้ความเคารพต่อเงื่อนไขหลังและสิ่งที่ไม่เปลี่ยนแปลงจากการออกแบบของคุณ
ไม่ใช่แค่ตัวสร้างการคัดลอกเท่านั้น - การดำเนินการจำนวนมากที่ยอดเยี่ยมสามารถเกี่ยวข้องกับอินสแตนซ์ของชั้นเรียนของคุณตั้งแต่สองชุดขึ้นไป: หากคุณกำลังเปรียบเทียบการเพิ่ม / คูณ / หารการสร้างสำเนาการโคลนการกำหนดและอื่น ๆ มักจะเป็นกรณีที่คุณ ต้องมีการเข้าถึงข้อมูลส่วนตัวและ / หรือข้อมูลที่ได้รับการป้องกันในออบเจ็กต์อื่นหรือต้องการให้ใช้งานฟังก์ชันที่ง่ายขึ้นเร็วขึ้นหรือดีขึ้นโดยทั่วไป
โดยเฉพาะอย่างยิ่งการดำเนินการเหล่านี้อาจต้องการใช้ประโยชน์จากการเข้าถึงแบบส่วนตัวเพื่อทำสิ่งต่างๆเช่น:
- (ตัวสร้างการคัดลอก) ใช้สมาชิกส่วนตัวของอ็อบเจ็กต์ "rhs" (ด้านขวามือ) ในรายการตัวเริ่มต้นเพื่อให้ตัวแปรสมาชิกถูกสร้างขึ้นเองแทนที่จะเป็นค่าเริ่มต้นที่สร้างขึ้น (แม้ว่าจะถูกกฎหมาย) จากนั้นก็กำหนดด้วย (อีกครั้ง, ถ้าถูกกฎหมาย)
- แบ่งปันทรัพยากร - จัดการไฟล์ส่วนหน่วยความจำที่ใช้ร่วมกัน
shared_ptr
เพื่ออ้างอิงข้อมูลเป็นต้น
- เป็นเจ้าของสิ่งต่างๆเช่น
auto_ptr<>
"ย้าย" ความเป็นเจ้าของไปยังวัตถุที่กำลังก่อสร้าง
- คัดลอก "แคช" ส่วนตัวการปรับเทียบหรือสมาชิกของรัฐที่จำเป็นในการสร้างวัตถุใหม่ในสถานะที่สามารถใช้งานได้อย่างเหมาะสมโดยไม่ต้องสร้างใหม่ตั้งแต่ต้น
- คัดลอก / เข้าถึงข้อมูลการวินิจฉัย / ติดตามที่เก็บไว้ในอ็อบเจ็กต์ที่ถูกคัดลอกซึ่งไม่สามารถเข้าถึงได้ผ่าน API สาธารณะ แต่อาจถูกใช้โดยอ็อบเจ็กต์ข้อยกเว้นหรือการบันทึกในภายหลัง (เช่นบางอย่างเกี่ยวกับเวลา / สถานการณ์เมื่ออินสแตนซ์ที่สร้างขึ้น "ดั้งเดิม" ที่ไม่ใช่การคัดลอก ถูกสร้างขึ้น)
- ดำเนินการคัดลอกข้อมูลบางอย่างที่มีประสิทธิภาพมากขึ้นเช่นวัตถุอาจมีเช่น
unordered_map
สมาชิก แต่เปิดเผยต่อสาธารณะเท่านั้นbegin()
และตัวทำend()
ซ้ำ - ด้วยการเข้าถึงโดยตรงเพื่อให้size()
คุณสามารถreserve
คัดลอกได้เร็วขึ้น แย่ลงยังคงถ้าพวกเขาเท่านั้นที่เปิดเผยat()
และinsert()
และอื่น ๆthrow
....
- คัดลอกการอ้างอิงกลับไปยังอ็อบเจ็กต์พาเรนต์ / การประสานงาน / การจัดการที่อาจไม่เป็นที่รู้จักหรือเขียนอย่างเดียวสำหรับโค้ดไคลเอ็นต์