Constructor เป็นฟังก์ชันพิเศษที่ทำงานอัตโนมัติเมื่อสร้าง Object ของคลาส ชื่อเหมือนคลาส ไม่มี return type
Default Constructor
Constructor ที่ ไม่มีพารามิเตอร์ (หรือพารามิเตอร์ทุกตัวมีค่า default)
โค้ดตัวอย่าง
#include <iostream>
using namespace std;
class DemoDC {
private:
int num1, num2;
public:
// Default Constructor - กำหนดค่าเริ่มต้น
DemoDC() {
num1 = 10;
num2 = 20;
cout << "Default Constructor called" << endl;
}
void display() {
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
}
};
int main() {
DemoDC obj; // เรียก Default Constructor อัตโนมัติ
obj.display();
return 0;
}
ผลลัพธ์
Default Constructor called num1 = 10 num2 = 20
Implicit Default Constructor
ถ้าไม่เขียน Constructor ใดๆ Compiler จะสร้าง Default Constructor ให้อัตโนมัติ:
- ไม่ทำอะไร (trivial)
- สมาชิก primitive type ไม่ได้ initialize (ค่า garbage)
- สมาชิก class type เรียก default constructor ของมัน
class Simple {
int x; // ไม่ได้ initialize
};
int main() {
Simple s; // ใช้ implicit default constructor
// s.x มีค่า garbage!
}
Default Constructor แบบมีพารามิเตอร์ Default
class Flexible {
int a, b;
public:
// ทั้ง 2 ตัวมีค่า default → ยังเป็น Default Constructor
Flexible(int x = 0, int y = 0) : a(x), b(y) {}
};
int main() {
Flexible f1; // ใช้ค่า default (0, 0)
Flexible f2(5); // a=5, b=0
Flexible f3(5, 10); // a=5, b=10
}
Member Initializer List (แนะนำ)
class Better {
const int id; // ต้อง init ที่นี่
string name;
vector<int> data;
public:
// ใช้ Initializer List - มีประสิทธิภาพกว่า assignment ใน body
Better(int id, string name) : id(id), name(std::move(name)), data(10) {}
};
เมื่อไหร่ Compiler ไม่สร้าง Implicit Default Constructor?
- มี Constructor อื่นที่ผู้ใช้กำหนดเอง (user-defined constructor)
- มีสมาชิกที่เป็น
constหรือreferenceไม่มี default initializer - มี Base Class ที่ไม่มี Default Constructor
- มี Member ที่เป็น Class ไม่มี Default Constructor
class NoDefault {
public:
NoDefault(int x) {} // มี constructor แล้ว
};
class Test {
NoDefault nd; // ❌ Error: NoDefault ไม่มี default constructor
// Test() {} // ต้องเขียน constructor เองและ init nd
};
การใช้งานกับ Container (vector, array)
#include <vector>
class NoDefaultCtor {
public:
NoDefaultCtor(int x) {}
};
int main() {
// vector<NoDefaultCtor> v(10); // ❌ Error: ต้องมี default constructor
vector<NoDefaultCtor> v;
v.emplace_back(42); // ✓ ใช้ emplace_back แทน
}
สรุป
| ประเภท | ลายเซ็น | ใช้เมื่อ |
|---|---|---|
| Default Constructor | ClassName() | ต้องการค่าเริ่มต้นคงที่ |
| Parameterized w/ Defaults | ClassName(int a=0, int b=0) | ต้องการความยืดหยุ่น |
| Implicit Default | (Compiler-generated) | ไม่มี constructor ใดๆ และสมาชิกทุกตัว init ได้เอง |
| Deleted | ClassName() = delete; | ห้ามสร้าง object แบบ default |