Constructor dan Destructor C++

Sebuah Class Diagram terdiri dari nama class, Attribute dan Operation. Kita ambil contoh class account yang digambarkan pada class diagram berikut ini.

class-diagram

By default sebuah class memiliki Contructor (ctor) dan Destructor (dtor). Jika sebuah class tidak dituliskan constructor dan destructor maka compiler secara otomatis akan membuat default constructor dan default desctructor untuk class tersebut .

Nama function untuk Constructor dan Destructor sama dengan nama class-nya. Untuk Destructor diawali tanda tilde (~). Contoh pada class Account,  Constructor: Account dan Destructor: ~Account. Baik Constructor maupun Destructor tidak memiliki return type.

Constractor dan Destructor merupakan member function yang spesial, karena fungsi constructor dijalankan secara otomatis ketika sebuah instance object di-create dan fungsi destructor dijalankan secara otomatis ketika instance object di-delete. Oleh karena itu Constructor biasanya dipakai untuk inisialisasi atau alokasi memori object yang dicreate sebelum object itu digunakan. Sedangkan Destructor biasanya dipakai untuk de-inisialisasi atau de-alokasi memory object tersebut.

#include <iostream>
using namespace std;
class CtorDtor
{ public:
	CtorDtor(int,char*);
	~CtorDtor();
  private: int objld;
	char *pes;
};
CtorDtor::CtorDtor(int objNo,char *pesPtr)
{ objld = objNo;
  pes = pesPtr;
  cout << "Object " << objld << " Eksekusi constructor" << pes << endl;
}
CtorDtor::~CtorDtor()
{ cout << (objld == 1 || objld == 6 ? "\n" : "");
  cout << "Object " << objld << " Eksekusi destructor" << pes << endl;
}
void interupsi()
{ cout << "Fungsi interupsi: Eksekusi mulai" << endl;
  CtorDtor lima (5," Lokal otomatis dalam interupsi");
  static CtorDtor enam (6," Lokal statis dalam interupsi");
  CtorDtor tujuh (7," Local otomatis dalam interupsi");
  cout << "Fungsi interupsi: Eksekusi selesai" << endl;
}
CtorDtor satu (1," Global sebelum main");
int main()
{ cout << "Fungsi main: Eksekusi mulai" << endl;
  CtorDtor dua (2," Lokal otomatis dalam main");
  static CtorDtor tiga (3," Lokal statis dalam main");
  interupsi();
  cout << "Fungsi main: Eksekusi kembali" << endl;
  CtorDtor empat (4," Lokal otomatis dalam main");
  cout << "Fungsi main: Eksekusi selesai" << endl;
  system("pause");
  return 0;
}

Output:

Normal 
Object 1 Eksekusi constructor Global sebelum main
Fungsi main: Eksekusi mulai
Object 2 Eksekusi constructor Lokal otomatis dalam main
Object 3 Eksekusi constructor Lokal statis dalam main
Fungsi interupsi: Eksekusi mulai
Object 5 Eksekusi constructor Lokal otomatis dalam interupsi
Object 6 Eksekusi constructor Lokal statis dalam interupsi
Object 7 Eksekusi constructor Local otomatis dalam interupsi
Fungsi interupsi: Eksekusi selesai
Object 7 Eksekusi destructor Local otomatis dalam interupsi
Object 5 Eksekusi destructor Lokal otomatis dalam interupsi
Fungsi main: Eksekusi kembali
Object 4 Eksekusi constructor Lokal otomatis dalam main
Fungsi main: Eksekusi selesai
Press any key to continue . . .

Constructor dapat memiliki argumen/parameter dan dapat di overload (Overloading Constructor), sedangkan Destructor tidak memiliki argumen dan tidak dapat di-overload.

Ada 3 jenis Constructor:

  • Default Constructor –> tidak memiliki argumen
  • Parameterized Constructor (Overloading Constructor) –> memiliki argumen
  • Copy Constructor –> memiliki argumen berupa object dari classnya sendiri

Copy Constructor adalah constructor yang meng-create object dengan inisialisasi object dari class yang sama.

//Sintaks penulisan copy constructor
classname (const classname &obj) 
{
   // body of constructor
}

Copy Constructor dijalankan secara otomatis ketika:

  • satu object di-copy dari object yang sama
  • object di-passing by value oleh function
  • object di-return by value dari fungsi

sehingga Copy Constructor biasanya dipakai untuk:

  • Inisialisasi satu object dari object yang sama
  • Copy object dan mem-passing-nya sebagai argumen
  • Copy object untuk mengembalikannya dari fungsi

Jika sebuah class tidak memiliki copy constructor maka compiler akan secara otomatis akan membuat copy constructor untuk class tersebut.

Jika sebuah class memiliki variable pointer dan dynamic memory allocations maka class tersebut harus memiliki copy constructor.

Berikut ini contoh program C++ dengan Copy Constructor.

#include <iostream>
using namespace std;
class Line
{  public:
int getLength( void );
Line(){}; //default constructor
Line( int len ); // overloading constructor
Line( const Line &obj); // copy constructor
~Line(); // destructor
private:
int *ptr;
};
// definition of overloading constructor
Line::Line(int len)
{   cout << "Normal constructor allocating ptr" << endl;
// allocate memory for the pointer;
ptr = new int;
*ptr = len;
}
// definition of copy constructor
Line::Line(const Line &obj)
{   cout << "Copy constructor allocating ptr." << endl;
ptr = new int;
*ptr = *obj.ptr; // copy the value
}
// definition of destructor
Line::~Line(void)
{   cout << "Freeing memory!" << endl;
delete ptr;
}
int Line::getLength( void )
{   return *ptr; }
void display(Line obj)
{   cout << "Length of line : " << obj.getLength() <<endl;
} //obj terminate, call destructor
// Main function
int main( ) {
{   Line line1(10); //calls overloading constructor
Line line2 = line1; // Call copy constructor
display(line1); //passing object, call copy constructor
display(line2);
system("pause");
return 0;
}

Sumber: https://www.tutorialspoint.com/cplusplus/cpp_copy_constructor.htm
Output:

Normal constructor allocating ptr
Copy constructor allocating ptr.
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Copy constructor allocating ptr.
Length of line : 10
Freeing memory!
Press any key to continue . . .

Send your comment