C()adalahanggotaclassyangbertugasmelakukaninisialisasiobyek (instance)dari suatu class C. Constructor mempunyai nama yang sama dengan nama class, dantidak mempunyaireturnvalue.Sebuahclassdapat mempunyailebihdarisatuconstructor. Constructoryangtidakmempunyaiargumen,disebutdefaultconstructor,sebaliknya constructoryangmempunyailebihdarisatuargumenadalahnon-defaultconsructor. Constructor dengan satu default argument tetap merupakan sebuah default constructor,
class C
{
public:
C(int count=10) : _count(count) {}
…
private:
int _count;
};
Compiler C++ dapat menambahkan default constructor bilamana diperlukan,jika dalam definisi class
Tidak tertulis secara eksplisit sebuah default constructor dan tidak ada deklarasi constructor lain (copy constructor).
Tidak ada anggota class berupa data const maupun reference.
Sebagai contoh definisi class C sebagai berikut,
class C {…};
C c1;// memerlukan default constructor
C c2(c1);// memerlukan copy constructor
Compiler C++ memutuskan untuk menambahkan default dan copy construtor setelah menemui kedua baris program tersebut, sehingga definisi class secara efektif menjadi sebagai berikut :
class C
{
public:
C();// default costructor
C(const C& rhs);// copy constructor
~C();// destructor
C& operator=(const C& rhs);// assignment operator
C* operator&();// address-of operator
const C* operator&(const C& rhs) const;
};
Compiler menambahkan public constructor, dan destructor. Selain itu, compiler juga menambahkan assignment operator dan address-of operator. Constructor (default dan non-default) tidak harus mempunyai akses public, sebagai contoh adalah pola desain (design pattern) Singleton.
class Singleton
{
public:
static Singleton* instance();
protected:
Singleton();
private:
static Singleton* _instance;
};
Obyek (instance) singleton tidak dibentuk melalui constructor melainkan melalui fungsi instance. Tidak ada obyek singleton lain yang dapat dibentuk jika sudah ada satu obyek singleton. Umumnya default constructor bentukan compiler (generated default constructor) menggunakan default constructor anggota bertipe class, sedangkan anggota biasa (built-in type) tidak diinisialisasi. Demikian halnya dengan obyek yang dibentuk dari obyek lain (copy), maka copy constructor bentukan compiler (generated copy constructor) menggunakan copy constructor dari anggota bertipe class pada saat inisialisasi. Sebagai contoh deklarasi class C berikut ini,
class C
{
public:
C(const char* aName);
C(const string& aName);
…
private:
std::string name;
};
Copy constructor bentukan compilermenggunakan copy constructor classstring untuk inisialisasi name dari aName. Jika class C tidak mempunyai constructor, maka compiler menambahkan juga default constructor untuk inisialisasi name menggunakan default constructor class string. Inisialisasi obyek menggunakan constructor (non-default) dapat dilakukan dengan member initializer maupun dengan assignment sebagai berikut,
member initialization
class C assignment
{ class C
int i,j; {
public: int i,j
C() : i(0),j(1) {} public:
… C()
}; {
i=0;j=0;
}
…
};
Kedua cara tersebut memberikan hasil yang sama, tidak ada perbedaan signifikan antara kedua cara tersebut untuk data bukan tipe class. Cara member initializermutlak diperlukan untuk data const maupun reference, seperti kedua contoh berikut ini:
class C//:1
{
public:
C(int hi,int lo) : _hi(hi),_lo(lo) {}
…
private:
const int _hi,_lo;// const member
};
class C//:2
{
public:
C(const string& aName) : name(aName) {}
…
private:
std::string& name;// reference member
};
Caramemberinitializationsebaiknya dilakukan untuk anggota bertipe class (user-defined type) seperti ditunjukkan pada contoh berikut ini,
class C
{
public:
C(const string& aName) : name(aName) { }
private:
std::string name;// bukan reference member
};
Pertimbangan menggunakan cara memberinitialization terletak pada efisiensi eksekusi program. Hal ini berkaitan dengan cara kerja C++ yang membentuk obyek dalam dua tahap,
•pertama, inisialisasi data
•kedua, eksekusi constructor (assignment)
Dengan demikian jika menggunakan cara assignment sebenarnya eksekusi program dilakukan dua kali, pertama inisialisasi kemudian assignment, sedangkan menggunakan memberinitialization hanya memanggil sekali constructor classstring. Semakin kompleks class tersebut (lebih kompleks dari classstring) semakin mahal (tidak efisien) proses pembentukan obyek melalui cara assignment.
Constructor dengan satu argumen berfungsi juga sebagaiimplicit conversion operator. Sebagai contoh deklarasi class A dan B berikut ini,
class A
{
public:
A();
};
class B
{
public:
B(const A&);
};
Pada cuplikan baris program di bawahini terjadi konversi tipe obyek A ke B secara implisit melalui copy constructor class B.
A a
B b=a;// implicit conversion
Dari penjelasan di atas dapat di implementasikan dalam program ini :
/*
Copy Constructor pada C++
karakteristik dari Constructor
-Nama Const dan Nama Kelas harus sama
-Tidak ada nilai balik (tidak boleh kosong)
*/
#include “iostream.h“
#include “iomanip.h“
#include “conio.h“
class Item
{
private:
int item_no;
char *item_name;
public :
Item()//Constructor tanpa para
{
cout << "Pemanggilan Cunstructor tanpa para" <<>
}
Item(int a,char *ptr)//Constructor dengan para
{
cout << "pemanggilan Constructor dengan 2 Para" <<>
Berdasarkan arti dari overloading yakni beban yang terlalu berat, tapi dalam pemrograman c++ overloading mempunyai 2 pengertian yang dapat disesuaikan dengan pemakaiannya.
OVERLOADING FUNCTION
Pada fungsi terdapat arti beberapa fungsi dapat memiliki argument berbeda tetapi nama fungsi yang sama sama. Pada fungsi ini dapat kita jelaskan pada progaram dalam pemanggilan fungsi yang mempunyai nama sama :
Contoh Program
# include “iostream.h”
#include ”stdio.h”
class variabel
{
private: char c; long x;
public:
void tulis (char c)
{
printf("karakter=c\n");
}
void tulis (int x)
{
printf("Bilangan bulat=x\n");
}
};
void main()
{
variabel penentuan;
penentuan.tulis('c');
}
Bentuk hasil compiler :
Penjelasan :
Pada program tersebut terdapat 2 fungsi yang sama, tapi tetapi compiler tahu fungsi manakah yang harus dipanggil yang di karenakan compiler tahu bahwa pada pemanggilan fungsi itu argument ”karakter= C” yang di panggil oleh compiler.
C++ hanya dapat mengkompilasi overloading function jika argument fungsinya berbeda. Bila argument fungsinya sama tetapi tipe nilai kembaliannya berbeda, compiler akan melaporkan adanya kesalahan.
Contoh :
Fungsi : double coba (int) ; ç dengan Fungsi è int coba (int) ;
* DEFAULT ARGUMEN
Contoh :
Void func ( int x = 0, int y = 0 ) ;
Maksudnya adalah :
Contoh fungsi diatas dapat dipanggil dengan 3 (tiga) cara berbeda :
1. func ( )// nilai x dan y otomatis 0
2. func ( 7 )// nilai x = 7 dan y = 0
3. func ( 7, 33 )// nilai x = 7 dan y = 33
Contoh deklarasi fungsi diatas akan terjadi kesalahan, jika variable x diberi nilai, sedangkan variable y tidak beri nilai.
Contoh :
Void func ( int x = 2, int y ) ;
* AMBIGUITY PADA OVERLOADING FUNCTION
Beberapa hal yang menimbulkan ketidak jelasan pada program :
1. type conversion
Contoh :
Void f ( double nilai )
Main ( )
{
Int I = 12 ;
F ( I ) ;
}
2. reference parameter
Parameter yang memiliki perbedaan hanya pada argument, dimana fungsi yang satu menggunakan reference parameter dan yang lainnya menggunakan value parameter.
Contoh :
Void func ( int x , int y );denganvoid func func ( int x , int& y) ;
Meskipun C++ telah memberikan kebebasan kepada kita untuk melakukanoverload ,namunadabeberapaoperatoryangtidakdiizinkan untukdi- overload . Berikutinioperator-operatoryangdimaksuddiatas.
..*::?:
Selainitukitajugatidakdiizinkanuntukmelakukanoverloadterhadap simbolpreprocessor , yaitu # dan ##. Untuklebihjelasnya,berikutinioperator-operatoryangdapatkita overload .
a.OperatorUnary
+ - * & ~ ! ++ -- -> ->*
b.OperatorBinary
+ - * / % ^ & | << >>
+= -= *= /= %= ^= &= |= <<= >>=
< <= > >= == != && ||
, [] ()
new new[] delete delete[]
MelakukanOverloadterhadapOperatorBinary
Padabagianinikitaakanmembahasmengenaioverload terhadap operatorbinary ,sedangkanoperatorunaryakandibahaspadasubbab selanjutnyadidalambukuini.HalinidimaksudkanagarAndadapat lebihmemahamikonsepnyaterlebihdahulu.Adapunoperatorbinary yangakandi- overloaddisinihanyalah tiga,yaituoperator +, -dan =.Ini disebabkankarenaAndatentusudahfamiliardenganpenggunaan operator-operatortersebut.Untuklebihlengkapnya,diharapkanAnda dapatmengembangkannyasendiri denganberbekalkonsep-konsepyang telahdidapatpadababini.Berikutinipenjelasanmengenaicara- cara melakukanoverloadterhadapoperator-operatoryangdimaksuddiatas.
Untukmelakukanoverloadterhadapoperator -tentuprinsipnyasama dengan overloadterhadap operator +di atas. Namun, sebagai pengetahuanbagiAnda,kita akan melakukan modifikasi terhadap programdiatasdenganmenambahkanfungsioperator untuk operator -. Adapunsintakprogramnyaadalahsebagaiberikut:
Contoh Program
#include ”iostream”
using namespace std;
class TITIK
{
int X, Y;
public:
// Membuat fungsi SetXY dan ShowXY
void SetXY(int XX, int YY)
{
X=XX;
Y=YY;
}
void ShowXY()
{
cout<<"Nilai X : "<<
cout<<"Nilai Y : "<<
}
// Mendeklarasikan fungsi operator untuk operator -
TITIK TITIK::operator -(TITIK P);
};
// Implementasi dari fungsi operator di atas
TITIK TITIK::operator -(TITIK P)
{
TITIK temp;// Membuat objek temporary yang bertipe TITIK
temp.X = X - P.X;
temp.Y = Y - P.Y;
return temp;
}
// Fungsi utama
int main()
{
// Melakukan instansiasi terhadap kelas TITIK
TITIK A, B, C;
// Mengeset nilai X dan Y untuk objek A dan B
A.SetXY(10, 6);
B.SetXY(4,2);
// Menampilkan nilai X dan Y yang terdapat pada objek A
A.ShowXY();
cout<
// Menampilkan nilai X dan Y yang terdapat pada objek A
B.ShowXY();
cout<
// Melakukan pengurangan terhadap objek A dan B
C = A - B;
// Menampilkan nilai X dan Y yang terdapat pada objek C
Sepertiyangkitalihatdiatasbahwauntukmemasukkannilaikedalam variabel Xyangterdapatpadaobjek A,kitamenggunakanfungsi SetX(). Disinikitatidakdapatmelakukannyadenganmenggunakanoperator =, yaitudenganstatemen:
A = 5;// SALAH, tidak diizinkan oleh kompiler
Namun, untuk mengatasi kasus seperti ini, sebenarnya kitadapat melakukanoverloadterhadapoperator=.Berikutinicontohprogram yangakanmenunjukkanhaltersebut.
DalamC++,kitajugadapatmelakukanoverloadterhadapoperator new sehinggakitadapatmelakukanpengalokasiansecarakhususuntuksuatu tipeataupunkelastertentu.Adapunbentukumumuntukmembuat fungsi operatoruntukoperator newyangtelahditentukandalamC++ adalahsebagaiberikut:
void *operator new(size_t size) {
// Statemen untuk menjalankan alokasi memori
// Jika alokasi gagal, lemparkan eksepsi bad_alloc
return pointer;
}
Padabentuk umum diatas,size_tadalah suatu tipeyangtelah didefinisikan di dalam C++ (hampir sama dengan tipeunsigned integer). Sebagaicontohdisinikitaakanmelakukanoverloadterhadapoperator newuntukkelastitik,dimanaapabilakitamelakukanpengalokasian memoriuntukkelastitiktersebut,makaoperatornewyangakan dipanggilolehkompileradalahoperatoryangtelahkitadefinisikan sendiri,bukanoperatornewyangtelahterdefinisidalamC++.Untuk lebihmemahaminya,berikutinisintakprogramyangmenunjukkanhal tersebut.
Contoh Program
#include ”iostream”
#include ”cstdlib” // Untuk menggunakan fungsi malloc()
#include ”new” // Untuk menggunakan eksepsi bad_alloc
using namespace std;
class TITIK
{
int X, Y;
public:
TITIK(int XX, int YY)
{
X = XX;
Y = YY;
}
void ShowXY()
{
cout<<"Nilai X : "<<
cout<<"Nilai Y : "<<
}
// Membuat fungsi operator untuk operator new
void *operator new(size_t size)
{
void *P;
cout<<"Operator new yang didefinisikan sendiri"<
// Melakukan alokasi memori
P = malloc(size);
// Jika gagal, lemparkan eksepsi bad_alloc
if (!P)
{
bad_alloc BA;
throw BA;
}
return P;
}
};
// Fungsi utama
int main()
{
// Mendeklarasikan pointer PT yang akan menunjuk tipe TITIK
TITIK *PT;
// Melakukan alokasi dengan operator new
try
{
PT = new TITIK(2, 5);
// Menampilkan nilai X dan Y
PT->ShowXY();
}
catch (bad_alloc E)
{
cout<<"Alokasi untuk PT gagal"<
return 1;
}
// Mendealokasikan memori
delete PT;
// Mendeklarasikan pointer yang akan menunjuk ke tipe int
Sepertiyangkitalihatdiatasbahwapadasaatkitamengalokasikantipe TITIK,makayangakandipanggiladalahoperatornewyangkita definisikansendiri.Namunpadasaatkitamengalokasikantipeint, operator new yangdigunakanadalahoperator new asliyangterdapatpada C++.Sebagaibukti,disaatkitamengalokasikantipeint,kitatidak melihatadanyateks"Operator new yang didefinisikan sendiri". Untukoperator deletediatasjugamenggunakanoperatoryangtelah terdefinisisecaradefaultdalamC++.Walaupundemikian,kitajuga dapatmelakukanoverloadterhadapoperator deletesepertiyangakan dibahaspadasubbabdibawahini.
2. OverloadOperator delete
Padabagianinikitaakanmembahasoverloaduntukoperatordelete melaluisebuahcontohprogram. Namun sebelumnya kita harus mengetahuiterlebihdahulubentuk umum untuk pembuatan fungsi operatoruntukoperator delete, yaitusepertiyangtampakdibawahini.
void operator delete(void *p)
{
// Mendealokasikan memori yang ditunjuk oleh pointer p
}
Adapunprogramyangakandituliskandibawahinimerupakan modifikasidariprogramdiatas.Disini,kitaakanmelakukanoverload terhadapoperator delete sehinggadapatdigunakansecarakhususuntuk kelas TITIK. Berikutinisintakprogramyangdimaksud.
Contoh Program :
#include ”iostream”
#include”cstdlib”// Untuk menggunakan fungsi malloc()
// dan free()
#include ”new”// Untuk menggunakan eksepsi bad_alloc
using namespace std;
class TITIK
{
int X, Y;
public:
TITIK(int XX, int YY)
{
X = XX;
Y = YY;
}
void ShowXY()
{
cout<<"Nilai X : "<<
cout<<"Nilai Y : "<<
}
// Membuat fungsi operator untuk operator new
void *operator new(size_t size)
{
void *P;
cout<<"Operator new yang didefinisikan sendiri"<
// Melakukan alokasi memori
P = malloc(size);
// Jika gagal, lemparkan eksepsi bad_alloc
if (!P)
{
bad_alloc BA;
throw BA;
}
return P;
}
// Membuat fungsi operator untuk operator delete
void operator delete(void *P)
{
cout<<"Operator delete yang didefinisikan sendiri"<
free(P);
}
};
// Fungsi utama
int main()
{
// Mendeklarasikan pointer PT yang akan menunjuk tipe TITIK
TITIK *PT;
// Melakukan alokasi dengan operator new
try
{
PT = new TITIK(2, 5);
// Menampilkan nilai X dan Y
PT->ShowXY();
}
catch (bad_alloc E)
{
cout<<"Alokasi untuk PT gagal"<
return 1;
}
// Mendealokasikan memori
delete PT;
// Mendeklarasikan pointer yang akan menunjuk ke tipe int
int *PI;
PI = new int;
*PI = 300;
cout<<"\nNilai *PI : "<<*PI<
return 0;
}
"-n(0ȡge: SV'>delete PT;
// Mendeklarasikan pointer yang akan menunjuk ke tipe int