Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Default Constructors ใน C++ (Constructor แบบไม่มีพารามิเตอร์)

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 ConstructorClassName()ต้องการค่าเริ่มต้นคงที่
Parameterized w/ DefaultsClassName(int a=0, int b=0)ต้องการความยืดหยุ่น
Implicit Default(Compiler-generated)ไม่มี constructor ใดๆ และสมาชิกทุกตัว init ได้เอง
DeletedClassName() = delete;ห้ามสร้าง object แบบ default