Arsip Kategori: 03. Constructor dan Destructor

Function dalam C++

Function dalam C++ berisi code statement yang melakukan tugas (task) yang koheren atau berhubungan.
Function biasanya digunakan untuk tugas yang berulang, sehingga kita tidak perlu menulis lagi coding yang sama (reusability).
Function juga biasanya dipakai untuk membuat program kita menjadi modular dan terstruktur sehingga mudah untuk ditangani (maintainable).
Alasan lainnya kita menggunakan function adalah abstraksi (abstraction). Misalkan kita ingin mencari akar kuadrat dari 64, kita cukup menggunakan fungsi sqrt(64) maka kita dapatkan hasilnya 8, tanpa harus memikirkan bagaimana cara mendapatkannya.

Ada 2 jenis function:

  • Library function –> kumpulan function dalam satu container yang disebut library, contoh library cmath <math.h> yang berisi fungsi-fungsi matematika seperti: sqrt(x), pow(x,y), dll.
  • User-defined function –> fungsi yang kita buat sendiri.

Sintaks penulisan User-defined function dalam C++ terdiri dari return_type, nama function, argument/parameter dan body function.

return_type function_name ( parameter list )
{
function_body;
}

Contoh function dalam C++ :

#include <iostream>
using namespace std;
int addition (int a, int b) //called or calling function berisi formal parameter
{    int r;
     r=a+b;
     return r;
}
int main ()
{    int z;
     z = addition (5,3); // caller function berisi actual parameter
     cout << "The result is " << z;
     return 0;
}

passing_by_value

Nilai (value) 5 dan 3 dikirim oleh fungsi pemanggil (caller function) ke fungsi called function atau calling function melalui parameter (Passing parameter).

Argument pada caller function disebut actual parameter dan argument pada calling function disebut formal parameter.

Ada 3 macam passing data pada function C++:

  • Passing By Value
  • Passing By Reference
  • Passing By Address
//passing by value
#include <iostream>
using namespace std;
void foo(int val)
{   val = 6;
}
int main()
{   int value = 5;
    cout << "value = " << value << '\n';
    foo(value);
    cout << "value = " << value << '\n';
    system("pause");
    return 0;
}
//passing by reference
#include <iostream>
using namespace std;
void foo(int &val)
{   val = 6;
}
int main()
{   int value = 5;
    cout << "value = " << value << '\n';
    foo(value);
    cout << "value = " << value << '\n';
    system("pause");
    return 0;
}
//passing by address
#include <iostream>
using namespace std;
void foo(int *ptr)
{   *ptr = 6;
}
int main()
{   int value = 5;
    cout << "value = " << value << '\n';
    foo(&value);
    cout << "value = " << value << '\n';
    system("pause");
    return 0;
}

Referensi:
https://www.tutorialspoint.com/cplusplus/cpp_functions.htm
http://www.cplusplus.com/doc/tutorial/functions/
http://www.learncpp.com/cpp-tutorial/72-passing-arguments-by-value/
http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/
http://www.learncpp.com/cpp-tutorial/74-passing-arguments-by-address/

Overloading Function

funcion_overloading

Dua fungsi atau lebih yang memiliki nama yang sama dengan argument/parameter yang berbeda dikenal sebagai overloading function.

Dalam C++, overloading function dapat dibuat dengan membedakan function signature-nya.

  1. Jumlah argument
  2. Type Data argument
  3. Urutan type data argument

Kita dapat membuat lebih dari 1 function dengan nama yang sama namun function signature yang beda.

Program C++ berikut ini mempunyai overloading function “Volume”. Ada 3 fungsi volume dengan signature yang beda.
Fungsi volume pertama dan kedua memiliki 1 argumen namun berbeda tipe data.
Fungsi volume ketiga dan keempat memiliki 2 argumen namun berbeda urutan type datan argumen.
Fungsi volume kelima memiliki 4 argumen, berbeda jumlah argumen dengan fungsi volume lainnya.
Dengan demikian kita bisa memiliki 5 fungsi yang namanya sama, Volume, tapi signaturenya berbeda.

#include <iostream>
using namespace std;
// volume kubus
int volume(int s)
{   return s*s*s;
}
// volume bola
int volume(double r)
{   return 3.14*r*r*r;
}
// volume silinder
double volume(double r, int h)
{   return 3.14*r*r*h;
}
// volume kerucut
double volume(int h,double r)
{   return 3.14*r*r*h;
}
// volume balok
long volume(long l, int b, int h)
{   return l*b*h;
}
int main()
{   cout << volume(3) << endl;// volume kubus
    cout << volume(10) << endl;// volume bola
    cout << volume(2.5, 4) << endl;// volume silinder
    cout << volume(8, 2.5) << endl;// volume kerucut
    cout << volume(5, 10, 15) << endl;// volume balok
    system("pause");
    return 0;
}

Output:

27
1000
78.5
157
750
Press any key to continue . . .

Default Argument dalam C++

Dalam program C++ kita bisa memberikan nilai (assign value) pada argument/parameter sebuah fungsi.

Default Argument berguna untuk memberikan nilai awal pada paramater fungsi yang memangilnya jika fungsi tersebut tidak mengirimkan nilai.
Function dengan Default Argument memungkinkan fungsi memanggilnya tanpa memberikan parameternya.

Cara kerja default argument

Cara kerja default argument

#include<iostream>
using namespace std;
// function dengan default arguments dapat dipanggil   
// dengan 2 atau 3 atau 4 arguments.
int sum(int x, int y, int z=0, int w=0)
{
    return (x + y + z + w);
}
int main()
{   //cout << sum(1) << endl; //error: minimal harus 2 arguments
    cout << sum(1, 2) << endl; // panggil dengan 2 arguments
    cout << sum(1, 2, 3) << endl; // panggil dengan 3 arguments
    cout << sum(1, 2, 3, 4) << endl; // panggil dengan 4 arguments
    system("pause");
    return 0;
}

Output:

3
6
10
Press any key to continue . . .

Default Argument diberikan mulai dari argument paling kanan (right most argument).

// Fungsi ini Invalid karena z ada default value,
// sedangkan w disebelah kanannya tidak ada
int sum(int x, int y, int z=0, int w)
//Fungsi ini juga Invalid karena tidak ada value argument ke 3
int sum(int x, int y=0, int z, int w=0)

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 . . .