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