7.1 ความหมายและหน้าที่ของ Constructor และ Destructor
7.1 ความหมายและหน้าที่ของ Constructor และ Destructor
Constructor และ Destructor เป็นฟังก์ชันพิเศษในโปรแกรมเชิงวัตถุ (Object-Oriented Programming) ที่มีบทบาทสำคัญในการจัดการการสร้างและทำลายวัตถุ (object) ของคลาส ช่วยให้สามารถจัดการทรัพยากรต่าง ๆ ที่วัตถุต้องการใช้ได้อย่างมีประสิทธิภาพ รวมทั้งช่วยให้การทำงานภายในโปรแกรมเป็นระบบและจัดระเบียบมากขึ้น
Constructor คือฟังก์ชันพิเศษที่ถูกเรียกใช้ทันทีเมื่อมีการสร้างวัตถุของคลาสขึ้นมา (เมื่อใช้คำสั่ง new หรือ MyClass obj;) โดยมีชื่อเดียวกับคลาสนั้น ๆ และไม่มีค่าที่ส่งกลับ (ไม่มี return type) Constructor เป็นจุดเริ่มต้นในการสร้างวัตถุ และเป็นส่วนที่ช่วยกำหนดสถานะเริ่มต้นให้กับวัตถุที่ถูกสร้าง ทำให้ไม่จำเป็นต้องตั้งค่าหรือเตรียมสถานะด้วยตัวเองทุกครั้งที่มีการสร้างวัตถุใหม่
หน้าที่ของ Constructor:
กำหนดค่าเริ่มต้นให้กับวัตถุ : Constructor ถูกออกแบบมาเพื่อกำหนดค่าเริ่มต้นให้กับคุณสมบัติ (attributes) ของวัตถุ เช่น การกำหนดค่าตัวเลข การกำหนดข้อความ หรือการตั้งค่าสถานะที่วัตถุต้องการใช้ในการทำงาน การกำหนดค่าเริ่มต้นนี้ทำให้วัตถุอยู่ในสถานะพร้อมใช้งานเมื่อสร้างขึ้น
จัดสรรทรัพยากรที่จำเป็นสำหรับวัตถุ : Constructor ยังทำหน้าที่จัดสรรทรัพยากรที่จำเป็นสำหรับการทำงานของวัตถุ เช่น การจัดสรรหน่วยความจำพิเศษ การเชื่อมต่อฐานข้อมูล การเปิดไฟล์ หรือการเตรียมข้อมูลที่ต้องใช้ในขณะทำงานจริง ทรัพยากรเหล่านี้จะถูกจัดสรรในช่วงเริ่มต้น เพื่อให้วัตถุพร้อมสำหรับการทำงานทันทีที่ถูกสร้างขึ้น
ตั้งค่าสถานะเริ่มต้นที่ปลอดภัยสำหรับการทำงานของวัตถุ : หน้าที่ของ Constructor คือการทำให้วัตถุมีสถานะที่เสถียรและปลอดภัยสำหรับการทำงาน เช่น การตรวจสอบให้แน่ใจว่าค่าที่กำหนดให้คุณสมบัติไม่เป็นค่า null หรือการตั้งค่าเริ่มต้นให้วัตถุมีคุณสมบัติครบถ้วนตามที่ระบบคาดหวัง การกำหนดค่าเริ่มต้นที่ดีช่วยลดความเสี่ยงของข้อผิดพลาดในภายหลัง ทำให้ระบบสามารถทำงานได้อย่างราบรื่น
ตัวอย่าง Constructor:
#include <iostream>
using namespace std;
class Book {
public:
string title;
int pages;
// Constructor ที่กำหนดค่าเริ่มต้นให้กับวัตถุ
Book(string t, int p) : title(t), pages(p) {
cout << "Book created with title: " << title << " and pages: " << pages << endl;
}
};
int main() {
Book myBook("Object-Oriented Programming", 300); // เรียกใช้ Constructor เพื่อสร้าง Book
return 0;
}
Destructor คือฟังก์ชันพิเศษที่ถูกเรียกใช้โดยอัตโนมัติเมื่อวัตถุกำลังจะถูกทำลาย หรือออกจากช่วงการใช้งาน (scope) หรือเมื่อมีการเรียกใช้คำสั่ง delete ในกรณีที่วัตถุถูกสร้างด้วยคำสั่ง new Destructor มีชื่อเดียวกับคลาสและนำหน้าด้วยเครื่องหมาย ~ และไม่มีค่าที่ส่งกลับ หน้าที่หลักของ Destructor คือการจัดการและคืนทรัพยากรที่วัตถุใช้ เช่น การคืนหน่วยความจำ ปิดไฟล์ หรือยกเลิกการเชื่อมต่อ ทำให้ไม่เกิดการรั่วไหลของหน่วยความจำ (memory leak) และป้องกันปัญหาด้านประสิทธิภาพของโปรแกรม
หน้าที่ของ Destructor:
คืนทรัพยากรที่ถูกใช้ไปโดยวัตถุ : Destructor ทำหน้าที่คืนทรัพยากรที่วัตถุใช้ไปในระหว่างการทำงาน เช่น การคืนหน่วยความจำที่ถูกจัดสรร การปิดไฟล์ที่เปิดอยู่ หรือการยกเลิกการเชื่อมต่อกับฐานข้อมูล ทรัพยากรเหล่านี้จะถูกปล่อยกลับไปสู่ระบบ เพื่อให้ระบบสามารถนำทรัพยากรเหล่านั้นไปใช้งานต่อได้อย่างมีประสิทธิภาพ
ป้องกันการรั่วไหลของหน่วยความจำ (Memory Leak) : การที่วัตถุไม่ได้คืนทรัพยากรเมื่อเสร็จสิ้นการใช้งานอาจทำให้เกิดการรั่วไหลของหน่วยความจำ ทำให้หน่วยความจำถูกใช้เกินความจำเป็นและอาจส่งผลให้โปรแกรมทำงานช้าลงหรือหยุดทำงานได้ Destructor ช่วยป้องกันปัญหานี้โดยการคืนค่าทรัพยากรทุกครั้งที่วัตถุถูกทำลาย
ทำความสะอาดและเตรียมการทำลายวัตถุ : Destructor ช่วยในการทำความสะอาดข้อมูลหรือสถานะภายในวัตถุเพื่อให้พร้อมสำหรับการทำลาย โดยการลบหรือทำให้ค่าในวัตถุกลายเป็นสถานะที่ไม่ส่งผลต่อการทำงานอื่นๆ ของระบบ ทำให้ระบบโดยรวมทำงานได้อย่างมีเสถียรภาพ
ตัวอย่าง Destructor:
#include <iostream>
using namespace std;
class Book {
public:
string title;
int pages;
// Constructor กำหนดค่าเริ่มต้นให้กับ Book
Book(string t, int p) : title(t), pages(p) {
cout << "Book created with title: " << title << " and pages: " << pages << endl;
}
// Destructor ลบทรัพยากรที่ไม่จำเป็นเมื่อ Book ถูกทำลาย
~Book() {
cout << "Book destroyed with title: " << title << endl;
}
};
int main() {
Book myBook("Object-Oriented Programming", 300); // สร้าง Book และเรียกใช้ Constructor
// เมื่อ myBook ออกจาก scope จะเรียกใช้ Destructor
return 0;
}
Constructor เป็นฟังก์ชันพิเศษที่ถูกเรียกใช้เมื่อสร้างวัตถุ ทำหน้าที่กำหนดค่าเริ่มต้น จัดสรรทรัพยากร และตั้งค่าสถานะเริ่มต้นให้กับวัตถุ ทำให้วัตถุอยู่ในสถานะพร้อมใช้งานและเสถียร
Destructor เป็นฟังก์ชันพิเศษที่ถูกเรียกใช้เมื่อวัตถุกำลังจะถูกทำลาย ทำหน้าที่คืนค่าทรัพยากรที่ถูกใช้ไป ทำความสะอาดข้อมูลภายในวัตถุ และป้องกันปัญหาการรั่วไหลของหน่วยความจำ