سلام!

موضوع این جلسه، تابع مخرب یا destructor است.

قبل از این جلسه با مفهوم constructor آشنا شدیم و دانستیم که constructor تابعی است که وقتی یک object از یک class بسازیم، صدا زده می شود و می توانیم در آن مقداردهی های اولیه را انجام دهیم.

حالا destructor تابعی است که وقتی یک object حذف می شود، صدا زده می شود. حالا این سوال پیش می آید که یک object چه وقت هایی حذف می شود؟ فرض کنید یک object معمولی (نه static) در یک scope (بین begin و end) ساخته اید. وقتی آن scope تمام شود، object های ساخته شده در آن scope نیز پاک می شوند. دستور delete هم باعث پاک شدن یک object می شود.

حال می خواهیم با طرز تعریف تابع مخرب آشنا شویم. قبلا برای تعریف تابع سازنده می نوشتیم:

CLASSNAME::CLASSNAME(INPUTS);

حالا برای تعریف تابع مخرب یک علامت مد (tilde) پشت تابع سازنده اضافه می کنیم. یعنی:

CLASSNAME::~CLASSNAME(NO_INPUTS);

این تابع ورودی ندارد.

حالا فایده های تابع مخرب چیست و اصلا چه دلیلی برای تعریف آن وجود دارد؟

همان طور که قبلا اشاره کردیم، compiler ها به طور پیش فرض متغیرهایی که allocate شده اند را پاک نمی کنند و باید برای پاک کردن آن ها از دستور delete استفاده کنیم. در تابع مخرب نیز باید همین کار را بکنیم. یعنی تمامی متغیرهای allocate شده را deallocate بکنیم. به عنوان مثال به کد زیر (کد مربوط به سوال ۴ سری قبلی تمرین ها) نگاه کنید.

#include <iostream>

using namespace std;

class Array{
    private:
        int* ar;
    public:
        Array();

        void set(int, int);

        int get(int);

        void sort();
};

Array::Array(){
    ar = new int[20];
}

void Array::set(int pos, int value){
    if (pos >= 0 || pos <= 20)
        ar[pos] = value;
}

int Array::get(int pos){
    if (pos >= 0 || pos <= 20)
        return ar[pos];
    else return -1;
}

void Array::sort(){
    for (int i = 0; i < 20; i++)
        for (int j = 0; j < 20; j++)
            if (ar[j] > ar[i])
                swap(ar[i], ar[j]);
}

int main(){
    Array* ar = new Array;
    for (int i = 0; i < 20; i++){
        int value;
        cin >> value;
        ar->set(i, value);
    }
    ar->sort();
    for (int i = 0; i < 20; i++)
        cout << ar->get(i) << " ";
    cout << endl;
    delete ar;
    return 0;
}



شکل درست این کد به صورت زیر است.

 #include <iostream>

using namespace std;

class Array{
    private:
        int* ar;
    public:
        Array();
        ~Array();

        void set(int, int);

        int get(int);

        void sort();
};

Array::~Array(){
    delete this->ar;
}

Array::Array(){
    ar = new int[20];
}

void Array::set(int pos, int value){
    if (pos >= 0 || pos <= 20)
        ar[pos] = value;
}

int Array::get(int pos){
    if (pos >= 0 || pos <= 20)
        return ar[pos];
    else return -1;
}

void Array::sort(){
    for (int i = 0; i < 20; i++)
        for (int j = 0; j < 20; j++)
            if (ar[j] > ar[i])
                swap(ar[i], ar[j]);
}

int main(){
    Array* ar = new Array;
    for (int i = 0; i < 20; i++){
        int value;
        cin >> value;
        ar->set(i, value);
    }
    ar->sort();
    for (int i = 0; i < 20; i++)
        cout << ar->get(i) << " ";
    cout << endl;
    delete ar;
    return 0;
}

این مبحث به تمرین خاصی نیاز ندارد. می توانید خودتان تمرین کنید.

موفق باشید!