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