Copy constructor
ภูวเดช นามไพร 650710578

Constructor :
เป็นวิธีพิเศษที่ใช้ในการกำหนดค่าเริ่มต้นของอ็อบเจ็กต์ จะถูกเรียกใช้เมื่อมีการสร้างอ็อบเจ็กต์ของคลาส และยังสามารถใช้กำหนดค่าเริ่มต้นให้กับฟิลด์ได้
Syntax:
Copy Constructor:
เป็นเครื่องมือที่ช่วยให้เราสร้างวัตถุใหม่โดยการคัดลอกข้อมูลจากวัตถุที่มีอยู่แล้ว ซึ่งเป็นประโยชน์ในการสร้างสำเนาของวัตถุหรือการหลีกเลี่ยงการแก้ไขข้อมูลของวัตถุต้นฉบับ และ C# ไม่ได้มี Copy Constructor ที่สร้างมาให้โดยอัตโนมัติเหมือนภาษา C++ เราต้องสร้าง Copy Constructor ขึ้นมาเองตามความต้องการของโปรแกรม
Syntax:
ตัวอย่าง:
ความแตกต่างระหว่าง Shallow Copy และ Deep Copy

Shallow copy :
คัดลอกแค่ "ที่อยู่" ของข้อมูล ไม่ได้คัดลอกข้อมูลจริงๆ
เหมาะสำหรับวัตถุที่ไม่ซับซ้อน หรือเมื่อต้องการให้วัตถุที่คัดลอกมาอ้างอิงข้อมูลเดียวกับวัตถุต้นฉบับ เร็วกว่า deep copy เนื่องจากไม่มีการจัดสรรหน่วยความจําใหม่
Deep copy:
คัดลอกทั้ง "ที่อยู่" และ "ข้อมูล" ทำให้ได้วัตถุใหม่ที่แยกจากกันจริงๆ
เหมาะสำหรับวัตถุที่ซับซ้อน มีหลายชั้น หรือเมื่อต้องการให้วัตถุที่คัดลอกมาเป็นอิสระจากวัตถุต้นฉบับ แต่จะช้ากว่า shallow copy เนื่องจากมีการจัดสรรหน่วยความจําใหม่
เปรียบเทียบ copy constructor ของ C# กับภาษา Java/C/Python
C:

ภาษา C ไม่มี Copy Constructor เพราะไม่ได้เป็นภาษาเชิงวัตถุ (object-oriented) แบบเต็มรูปแบบ แต่สามารถทำการคัดลอก struct หรือ object แบบทำเองได้โดยใช้การคัดลอก field ทีละตัว หรือใช้ฟังก์ชัน
Shallow copy:
การคัดลอก primitive types จากตัวแปรหนึ่งไปยังอีกตัวแปรหนึ่ง แต่ถ้าตัวแปรนั้นเป็น pointer จะทำการคัดลอกเพียง address ของ object ที่ pointer นั้นชี้อยู่ ดังนั้นทั้งต้นฉบับและตัวคัดลอกจะใช้ object เดียวกันในหน่วยความจำ
Deep copy:
การคัดลอกทั้งตัวแปร primitive และ object ที่ pointer ชี้ไป โดยการจัดสรร allocate new memory และคัดลอกข้อมูลที่อยู่ในหน่วยความจำเก่าไปยังหน่วยความจำใหม่ ทำให้ object ที่คัดลอกมามีความเป็นอิสระจาก object ต้นฉบับ
ตัวอย่าง C เทียบ copy constructor กับ C#
C#:
C:
Java:

ภาษา Java ไม่มี constructor สำหรับการคัดลอกโดยตรงเหมือนใน C++ หรือ C# แต่สามารถสร้าง Copy Constructor เองได้ โดยจะเป็นวิธีการสร้างวัตถุใหม่ โดยการคัดลอกค่าจากวัตถุที่มีอยู่แล้วมาใช้
Shallow copy:
การคัดลอกเฉพาะ primitive types และreferences ของ object แต่ไม่คัดลอกตัว object ที่ถูกอ้างอิง ทำให้ object ที่คัดลอกทั้งคู่ชี้ไปยัง object เดียวกันในหน่วยความจำ
Deep copy:
การคัดลอกทั้งค่าของตัวแปร primitive และการสร้างสำเนาของ object ที่ถูกอ้างอิงใหม่ทั้งหมด ทำให้ object ต้นฉบับและ object ที่ถูกคัดลอกไม่มีการแชร์ข้อมูลร่วมกัน ทุกส่วนของ object จะถูกคัดลอกอย่างอิสระ
ตัวอย่าง Java เทียบ copy constructor กับ C#
C#:
Java:
Python:

ภาษา Python ไม่มี copy constructor แบบที่พบใน C++ หรือ Java แต่วิธีการสร้างวัตถุใหม่โดยใช้ข้อมูลจากวัตถุที่มีอยู่แล้ว ใน Python, __init__ method ทำหน้าที่เป็นตัวสร้างวัตถุ และ Copy Constructor สามารถสร้างได้โดยการกำหนดวิธีการที่มีรูปแบบเฉพาะ
Shallow copy:
สร้างวัตถุใหม่ แต่แทนที่จะคัดลอกองค์ประกอบของวัตถุดั้งเดิม จะคัดลอกอ้างอิงไปยังวัตถุเหล่านั้น ซึ่งหมายความว่าการเปลี่ยนแปลงที่ทำกับวัตถุที่ฝังอยู่ (nested objects) ในวัตถุที่คัดลอกมาจะสะท้อนไปยังวัตถุดั้งเดิมและในทางกลับกัน ใน Python โมดูล copy และมีเมธอด copy()
Deep copy:
โดยสร้างวัตถุใหม่และคัดลอกวัตถุย่อยทั้งหมดแบบเรียกซ้ำ (recursively) เพื่อให้แน่ใจว่าการเปลี่ยนแปลงในวัตถุที่คัดลอกมาไม่ส่งผลกระทบต่อวัตถุดั้งเดิม โมดูล copy ของ Python และยังมีเมธอด deepcopy()
ตัวอย่าง Python เทียบ copy constructor กับ C#
C#:
Python:
Video:
Slide:
Reference:
w3schools. (n.d.). C# Constructors.
ankita_saini. (04 Dec, 2021). C# | Copy Constructor.
Anupam Singh. (04 Feb, 2022).Shallow Copy and Deep Copy Using C#.
OpenGenus Tech Review Team. (n.d.). Copy struct in C [Shallow & Deep Copy].
Javatpoint. (n.d.). Shallow Copy Vs. Deep Copy in Java.
GeeksforGeeks.(13 Feb, 2024). Copy Constructor in Python.
Microsoft. (03/12/2024). How to write a copy constructor (C# Programming Guide).
Last updated
