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

การเล่นกับ Destructors ใน C++

Destructor เป็นฟังก์ชันของคลาสใน C++ ที่ทำหน้าที่ลบออบเจ็กต์ของคลาส

การเรียก Destructor

Destructor จะถูกเรียกเมื่อออบเจ็กต์ของคลาสออกจากขอบเขต (scope) ในโปรแกรม กรณีที่ออบเจ็กต์ออกจากขอบเขต:

  • โปรแกรมออกจากขอบเขตของฟังก์ชัน

  • โปรแกรมจบการทำงาน

  • บล็อกที่เริ่มต้นตัวแปรท้องถิ่นของออบเจ็กต์ออกจากขอบเขต

  • เมื่อ operator delete ของออบเจ็กต์ถูกเรียก

ตัวอย่าง

มาดูโค้ดและทายผลลัพธ์ของโปรแกรม:

#include <iostream>
using namespace std;

int i;

class destructor {
public:
    ~destructor() {
        i = 10;
    }
};

int valueInitializer() {
    i = 3;
    destructor d1;
    return i;
}

int main() {
    cout << "i = " << valueInitializer() << endl;
    return 0;
}

ผลลัพธ์

i = 3

มาเข้าใจโค้ดก่อน ที่นี่เราสร้างตัวแปร global i แล้วในฟังก์ชัน value initialized เราเปลี่ยนค่าของมัน ที่นี่เราเริ่มต้นด้วยค่า 3 แล้วสร้างออบเจ็กต์ d1 แล้วคืนค่า

ทายผลลัพธ์ไหม?

คือ 3 ยินดีด้วยถ้าคุณทายถูก และไม่ต้องกังวลถ้าคิดว่าเป็น 10 ตอนนี้ดูสิ่งที่เกิดขึ้น:

ตามที่อธิบายไว้ข้างต้น destructor จะถูกเรียกเมื่อฟังก์ชันที่เรียกออกจากขอบเขต และก่อนออกจากขอบเขต ฟังก์ชันได้คืนค่า 3 กลับไปแล้ว

ตัวอย่าง

ลองทายอีกครั้ง ผลลัพธ์ของบล็อกนี้จะเป็นอะไร?

#include <iostream>
using namespace std;

int i;

class destructor {
public:
    ~destructor() {
        i = 10;
    }
};

int& valueInitializer() {
    i = 3;
    destructor d1;
    return i;
}

int main() {
    cout << "i = " << valueInitializer() << endl;
    return 0;
}

ผลลัพธ์

โค้ดนี้ดูคล้ายกันแต่นี้

พิมพ์: i = 10 แทน

ทำไม?

ที่นี่ เราคืนค่าอ้างอิง (reference) ของตัวแปรแทนค่า ดังนั้นเมื่อ destructor ถูกเรียก มันเปลี่ยนค่าเป็น 10 และเนื่องจากส่งอ้างอิง 10 จึงถูกพิมพ์ออกมา