gravatar

Classes

Classes

Class adalah metode logical untuk organisasi data dan fungsi dalam struktur yang sama. Class dideklarasikan menggunakan keyword class, yang secara fungsional sama dengan keyword struct, tetapi dengan kemungkinan penyertaan fungsi sebagai anggota, formatnya sbb :

class class_name {

permission_label_1:

member1;

permission_label_2:

member2;

...

} object_name;

Dimana class_name adalah nama class(user defined type) dan field optional object_name adalah satu atau beberapa identifier objek yang valid. Body dari deklarasi berisikan members, yang dapat berupa data ataupun deklarasi fungsi, dan permission labels (optional), dapat berupa satu dari tiga keyword berikut : private:, public: atau protected:. Digunakan untuk menentukan batasan akses terhadap members yang ada :

· private , anggota class dapat diakses dari danggota lain pada kelas yang sama atau dari class "friend".

· protected , anggota dapat diakses dari anggota class yang sama atau class friend , dan juga dari anggota class turunannya(derived).

· public , anggota dapat diakses dari class manapun.

Default permission label : private

Contoh :

class CRectangle {

int x, y;

public:

void set_values (int,int);

int area (void);

} rect;

Deklarasi class CRectangle dan object bernama rect. Class ini berisi empat anggota: dua variable bertipe int (x and y) pada bagian private (karena private adalah default permission) dan dua fungsi pada bagian public : set_values() dan area(), dimana hanya dideklarasikan propotype_nya.

Perhatikan perbedaan antara nama classdan nama object. Pada contoh sebelumnya CRectangle adalah nama class(contoh, user-defined type), dan rect adalah object dari tipe CRectangle. Sama halnya dengan deklarasi berikut :

int a;

int adalah nama class (type) dan a adalah nama object(variable).

Contoh :

// classes example

#include

class CRectangle {

int x, y;

public:

void set_values (int,int);

int area (void) {return (x*y);}

};

void CRectangle::set_values (int a, int b) {

x = a;

y = b;

}

int main () {

CRectangle rect;

rect.set_values (3,4);

cout << "area: " <<>

}

Output :

area: 12

Hal baru dari contoh diatas adalah operator :: dari lingkup yang disertakan dalam pendefinisian set_values(). Digunakan untuk mendeklarasikan anggota dari class diluar class tersebut.

Scope operator (::) menspesifikasikan class dimana anggota yang dideklarasikan berada, memberikan scope properties yang sama seperti jika dideklarasikan secara langsung dalam class.

Contoh :

// class example

#include

class CRectangle {

int x, y;

public:

void set_values (int,int);

int area (void) {return (x*y);}

};

void CRectangle::set_values (int a, int b) {

x = a;

y = b;

}

int main () {

CRectangle rect, rectb;

rect.set_values (3,4);

rectb.set_values (5,6);

cout << "rect area: " <<>

cout << "rectb area: " <<>

}

Output :

rect area: 12
rectb area: 30

Perhatikan pemanggilan rect.area() tidak memberikan hasil yang sama dengan pemanggilan rectb.area(). Ini disebabkan karena objek dari class CRectangle mempunyai variable sendiri, x dan y, dan fungsi set_value() dan area().

Constructor dan destructor

Objek biasanya memerlkan inisialisasi variable atau menentukan memori dinamik selama proses untuk mencapai hasil akhie yang diharapkan dan menghindari pengembalian nilai yang tidak diharapkan.

Untuk mengatasinya dapat digunakan fungsi spesial : constructor, yang dapat dideklarasikan dengan pemberian nama fungsi dengan nama yang sama untuk class. Fungsi dari constructor ini akan dipanggil secara otomatis ketika instance baru dari sebuah class dibuat. Contoh :

// classes example

#include

class CRectangle {

int width, height;

public:

CRectangle (int,int);

int area (void) {return (width*height);}

};

CRectangle::CRectangle (int a, int b) {

width = a;

height = b;

}

int main () {

CRectangle rect (3,4);

CRectangle rectb (5,6);

cout << "rect area: " <<>

cout << "rectb area: " <<>

}

Output :

rect area: 12
rectb area: 30

Hasil dari contoh diatas sama seperti contoh sebelumnya. Dalam hal ini, hanya menggantikan fungsi set_values, yang sudah tidak ada dengan class constructor. Perhatikan cara parameter diberikan ke constructor pada saat instance class dibuat :

CRectangle rect (3,4);
CRectangle rectb (5,6);

Destructor berfungsi kebalikannya. Secara otomatis akan dipanggil jika objek di keluarkan dari memory, ataupun karena keberadaannya telah selesai (contoh : jika didefinisikan sebuah objek local dalam function dan function tersebut selesai) atau karena merupakan objek yang secara dinamis ditetapkan dan dikeluarkan dengan menggunakan operator delete.

Destuctor harus mempunyai nama yang sama dengan class, diberi awalan tile (~) dan tidak mengembalikan nilai. Contoh :

// example on constructors and destructors

#include

class CRectangle {

int *width, *height;

public:

CRectangle (int,int);

~CRectangle ();

int area (void) {return (*width * *height);}

};

CRectangle::CRectangle (int a, int b) {

width = new int;

height = new int;

*width = a;

*height = b;

}

CRectangle::~CRectangle () {

delete width;

delete height;

}

int main () {

CRectangle rect (3,4), rectb (5,6);

cout << "rect area: " <<>

cout << "rectb area: " <<>

return 0;

}

Output :

rect area: 12

rectb area: 30

Overloading Constructors

Sama halnya seperti fungsi, constructor juga dapat mempunyai nama yang sama tetapi mempunyai jumlah dan tipe yang berbeda pada parameternya. Pada saat pemanggilan kompiler akan meng-eksekusi yang sesuai pada saat objek class di deklarasikan.

Pada kenyataannya, ketika dideklarasikan sebuah class dan tidak disebutkan constructornya, maka kompiler secara otomatis akan mengasumsikan dua constructor overloaded ("default constructor" dan "copy constructor"). Contoh :

class CExample {

public:

int a,b,c;

void multiply (int n, int m) { a=n; b=m; c=a*b; };

};

Jika tanpa constructor, Kompiler secara otomatis mengasumsikan anggota-anggota fungsi constructor berikut :

· Empty constructor

Merupakan constructor tanpa parameters didefinisikan sebagai nop (blok instruksi kosong). Tidak melakukan apapun.

CExample::CExample () { };

· Copy constructor

Merupakan constructor dengan satu parameter dengan tipe yang sama yang ditetapkan untuk setiap anggota variable class nonstatik objek yang disalin dari objek sebelumnya.

CExample::CExample (const CExample& rv) {

a=rv.a; b=rv.b; c=rv.c;

}

Penting untuk mengetahui, bahwa kedua constructor default : empty construction dan copy constructor ada jika tidak ada constructor lain yang dideklarasikan. Jika terdapat constructor dengan sejumlah parameter dideklarasikan, maka tidak satupun dari constructors default ini ada.

Contoh :

// overloading class constructors

#include

class CRectangle {

int width, height;

public:

CRectangle ();

CRectangle (int,int);

int area (void) {return (width*height);}

};

CRectangle::CRectangle () {

width = 5;

height = 5;

}

CRectangle::CRectangle (int a, int b) {

width = a;

height = b;

}

int main () {

CRectangle rect (3,4);

CRectangle rectb;

cout << "rect area: " <<>

cout << "rectb area: " <<>

}

Output :

rect area: 12
rectb area: 25

Contoh diatas rectb dideklarasikan tanpa parameter, sehingga diinisialisasikan dengan constructor tanpa parameters, yang mendeklarasikan width dan height dengan nilai 5.

Perhatikan jika dideklarasikan objek baru dan tidak diberikan parameter maka tidak diperlukan tanda kurung ():

CRectangle rectb; // right

CRectangle rectb(); // wrong!

test for long comment test for long comment test for long comment test for long comment test for long comment test for long comment test for long comment test for long comment test for long comment test for long comment test for long comment