การเริ่มต้นการคัดลอกสามารถทำได้โดยใช้แนวคิดของตัวสร้างการคัดลอก อย่างที่เราทราบดีว่าคอนสตรัคเตอร์ใช้ในการเริ่มต้นวัตถุ เราสามารถสร้างตัวสร้างการคัดลอกเพื่อทำสำเนาของวัตถุอื่น หรือกล่าวอีกนัยหนึ่ง เริ่มต้นวัตถุปัจจุบันด้วยค่าของวัตถุอื่น ในทางกลับกัน การเริ่มต้นโดยตรงสามารถทำได้โดยใช้การดำเนินการมอบหมาย
ความแตกต่างหลัก ระหว่างการเริ่มต้นสองประเภทนี้คือ การเริ่มต้นสำเนาสร้างบล็อกหน่วยความจำแยกต่างหากสำหรับวัตถุใหม่ แต่การเริ่มต้นโดยตรงไม่ได้สร้างพื้นที่หน่วยความจำใหม่ ใช้ตัวแปรอ้างอิงเพื่อชี้ไปที่บล็อกหน่วยความจำก่อนหน้า
คัดลอกตัวสร้างหรือคัดลอกการเริ่มต้น (ไวยากรณ์)
classname (const classname &obj) { // body of constructor }
การเริ่มต้นโดยตรงหรือตัวดำเนินการมอบหมาย (ไวยากรณ์)
classname Ob1, Ob2; Ob2 = Ob1;
ให้เราดูความแตกต่างโดยละเอียดระหว่างการเริ่มต้นการคัดลอกและการเริ่มต้นโดยตรง
คัดลอกการเริ่มต้น | การเริ่มต้นโดยตรง |
---|---|
การเริ่มต้นการคัดลอกนั้นเป็นคอนสตรัคเตอร์ที่โอเวอร์โหลด | การเริ่มต้นโดยตรงสามารถทำได้โดยใช้ตัวดำเนินการมอบหมาย |
สิ่งนี้จะเริ่มต้นวัตถุใหม่ด้วยวัตถุที่มีอยู่แล้ว | สิ่งนี้กำหนดค่าของวัตถุหนึ่งให้กับวัตถุอื่นซึ่งทั้งสองมีอยู่แล้ว |
การคัดลอกเริ่มต้นใช้เมื่อมีการสร้างวัตถุใหม่ด้วยวัตถุที่มีอยู่ | ใช้เมื่อเราต้องการกำหนดวัตถุที่มีอยู่ให้กับวัตถุใหม่ |
วัตถุทั้งสองใช้ตำแหน่งหน่วยความจำแยกกัน | ใช้ตำแหน่งหน่วยความจำหนึ่งตำแหน่ง แต่ตัวแปรอ้างอิงต่างกันชี้ไปยังตำแหน่งเดียวกัน |
หากไม่มีการกำหนดคอนสตรัคเตอร์การคัดลอกในคลาส คอมไพเลอร์จะจัดเตรียมให้ | หากตัวดำเนินการมอบหมายไม่โอเวอร์โหลด ระบบจะทำการคัดลอกระดับบิต |