DESTRUCTOR

Author: bLue biRd // Category:
Destructor adalah anggota class (member function) yang berfungsi melepas memori pada saat suatu obyek sudah tidak diperlukan lagi. Fungsi destructor kebalikan constructor. Destructor tidak mempunyai atau memerlukan argumen. Destructor juga tidak mengembalikan nilai apapun (tidak mempunyai return type). Seperti halnya constructor, compiler dapat menambahkan sebuah destructor jika sebuah class tidak mempunyai destructor.
virtual Destructor
Sebuah destructor dapat berupa fungsi virtual. Hal ini menjadi keharusan jika class B,

• merupakan base class.
• class D yang menggunakan B sebagai base class mempunyai anggota berupa data dengan alokasi memori dinamik (pointer).

class B

{

public:

B();

~B();

};

class D : public B

{

public:

D() : p(new char[256]) {}

~D()

{

delete[] p;

}

private:

char *p;

};



Pada contoh tersebut destructor base class B bukan fungsi virtual. Dalam C++ umumnya obyek class D digunakan secara polimorphic dengan membentuk obyek class D (derived class) dan menyimpan alamat obyek tersebut dalam pointer class B (base class) seperti pada contoh berikut ini,

void main(void)

{

B *pB=new D();

delete pB;

}


Dalam standar C++ menghapus obyek D (derived class) melalui pointer class B (base class) sedangkan destructor base class non-virtual mempunyai efek yang tidak menentu (undefined behaviour). Apabila standard C++ tidak menetapkan apa yang seharusnya berlaku, maka terserah kepada pembuat compiler menentukan perilaku program pada kondisi semacam ini. Umumnya pembuat compiler mengambil langkah untuk tidak memanggil destructor class D (derived class). Dengan demikian, pada saat menjalankan perintah delete, destructor class D tidak dieksekusi karena destructor base class B non-virtual. Akibatnya lokasi memori dinamik yang digunakan class D tidak pernah dilepas. Hal ini adalah contoh lain terjadinya pemborosan memori (memory leak) oleh suatu program. Jalan keluarnya adalah membuat destructor base class B virtual,

class B

{

public:

B();

virtual ~B();

}

Tidak seperti destructor, tidak ada virtual constructor atau virtual copy constructor. Pada saat membentuk obyek, tipe obyek harus diketahui terlebih dahulu, apakah membentuk obyek class A, B, C dsb. Tidak ada aspek bahasa C++ untuk mewujudkan virtual constructor secara langsung, menempatkan virtual pada deklarasi constructor merupakan kesalahan yang terdeteksi pada proses kompilasi. Efek virtual constructor bukan tidak mungkin dicapai, C++ memungkinkan membuat idiom virtual constructor yang bertumpu pada fungsi virtual dalam kaitannya dengan hubungan antara sebuah class dengan base classnya.


Source code

Penerapan Memberwise Copy dan Destructor

#include

class Date {

public:

Date (int =1, int =1, int =1990);

void print();

private:

int month;

int day;

int year;

};

Date::Date (int m, int d, int y) {

month =m;

day =d;

year =y;

}

void Date::print(){

cout<

}

Date::~Date(){ //definisi destructor

cout<<"\nDestructor dipanggil"<

}

void main() {

Date date1(7,4,1993),date2; //Date2 default to 1/1/90

cout<<"Date1= ";

date1.print();

cout<<"\n Date2= ";

date2.print();

date2=date1;

cout<<"\n\n After default memberwise copy, date2=";

date2.print();

cout<

}



0 Responses to "DESTRUCTOR"

Posting Komentar