Tutorial C++ : Kelas part I

02Apr08

Kelas

Sebuah kelas merupakan pengembangan konsep dari struktur data: tidak hanya data, tapi juga dapat menangani data dan fungsi.

Sebuah objek merupakan perwakilan dari sebuah kelas. Dalam perbandingan dengan variabel, sebuah kelas akan menjadi tipe data dan objeknya menjadi variabel.

Kelas dideklarasi menggunakan kata kunci class, dengan format berikut:

class class_name

{

access_specifier_1:

member1;

access_specifier_2:

member2;

….

} object_names;

dimana class_name merupakan identifier sah untuk kelas, object_names merupakan daftar nama opsional dari objek pada kelas ini. Isi deklarasi bisa mencakup anggota yang meliputi deklarasi data atau fungsi, dan “optionally access specifiers“.

Seluruhnya sangat mirip dengan deklarasi pada struktur data, kecuali bahwa kita bisa memasukkan fungsi dan anggota, tapi juga hal baru ini disebut access specifier. Access specifier merupakan satu dari tiga kata kunci berikut: private, public, atau protected. Specifiers ini mengatur hak akses dimana anggota dibutuhkan:

  • anggota private, dapat diakses hanya oleh anggota pada kelas yang sama dan friends mereka
  • anggota protected bisa diakses oelh anggota dari kelas yang sama dan friends mereka, namun juga dari anggota turunan kelas mereka
  • anggota public dapat diakses dari mana saja dimana objek terlihat.

Secara default, semua anggota kelas dideklarasi dengan kata kunci class memiliki akses private untuk setiap anggotanya. Jadi, setiap anggota yang dideklarasi sebelum specifier kelas lain memiliki akses private. Contohnya:

class CRectangle {
int x, y;
public:
void set_values (int,int);
int area (void);
} rect;

Deklarasi sebuah kelas(yakni tipe) CREctangle dan sebuah objek yang dinamakan rect.Kelas ini berisi empat anggota: dua anggota data bertipe int(anggota x dan y) dengan akses private(secara default) dan dua anggota fungsi dengan akses publik: set_value() dan area(), di mana sekarang baru disertakan deklarasi, belum definisinya.

Perhatikan perbedaan antara nama kelas dan nama objek: dalam contoh sebelumnya, Crectangle adalah nama kelas, sedangkan rect adalah nama objek dengan tipe Crectangle. Hal ini sama dengan hubungan int dan a pada deklarasi di bawah ini:

int a;

Dimana int merupakan nama tipe(kelas) dan a merupakan nama variabel(objek).
Setelah deklarasi sebelumnya yakni Crectangle dan rect, kita bisa mengacu dalam isi program untuk anggota publik dari objek rect seperti mereka fungsi dan variabel normal, dengan menambahkan nama objek diikuti dengan dot(.) dan nama anggota. Selayaknya yang kita lakulan pada struktur data sebelumnya. Contohnya:

rect.set_values(3,4);
myarea=rect.area();

Anggota rect yang tidak dapat diakses dari isi program kita diluar kelas adalah x dan y, karena mereka dalam akses private dan mereka hanya bisa diacu dari anggota lain pada kelas yang sama.

Ini merupakan contoh lengkap dari kelas CRectangle:

// classes example
#include <iostream>
using namespace std;

class CRectangle {
int x, y;
public:
void set_values (int,int);
int area () {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: ” << rect.area();
return 0;
}

Area: 12

Hal baru yang paling penting dalam koding adalah operator lingkup(::, titik dua) yang mencakup definisi set_values(). Ini digunakan untuk mendefinisi anggota kelas dari luar definisi kelas itu sendiri.

Anda dapat memperhatikan bahwa definisi dari fungsi anggota area() telah meliputi langsing definisi kelas CRectangle yang diberikan secara sederhana, dimana set_value() hanya memiliki prototype yang dideklarasi di dalam kelas,namun definisi ini berada diluarnya. Dalan deklarasi di luar, kita harus menggunakan operator scope(::) untuk menjelaskan bahwa kita mendefinisi sebuah fungsi yang merupakan anggota dari kelas Crectangle dan bukan fungsi global biasa.

Operator Scope(::) menjelaskan kelas dimana anggota tersebut dideklarasi, memperbolehkan lingkup properti yang sama seakan definisi fungsi disertakan dalan definisi kelas. Contohnya, dalam fungsi set_values() dari koding sebelumnya.. kita bisa menggunakan variabel x dan y, yang merupakan anggota privat kelas Crectangle, yang berarti mereka hanya dapat diakses oleh anggota lain dari kelas tersebut.

Perbedaan antara definisi fungsi anggota kelas meliputi kelas tersebut atau mencakup prototype dan kemudian definisinya, adalah dalan kasus pertama, fungsi akan secara otomatis dipertimbangkan dalam fungsi anggota inline oleh compiler, dan kasus keduam merupakan fungsi anggota normal(not-inline) , dimana dalam kenyataannya, tidak ada perbedaan dalam behavior.

Anggota x dan y memiliki hak akses private(ingat bahwa jika tidak ada yang dikatakan, semua anggota kelas didefinisi dengan hak akses private). Dengan deklarasi private, kita menolak mengakses mereka dari semua tempat diluar kelas. Ini membuat masalah, sebah kita telah mendefinisikan fungsi anggota untuk mengatur nilai anggota dalan objek: fungsi anggota set_values();. Untuk itu, sisanya dari program tidakmembutuhkan akses langsung untuk mereka. Mungkin dalam contoh singkat, ini sulit untuk melihat kegunaan melindungi dua variabel tersebut, namun dalan proyek lebih besar, akan sangat penting bahwa nilai tidak dapat dimodifikasi dalam cara yang tidak diharapkan( tidak diharapkan dari sudut pandang objek).

satu keuntungan besa dari kelas bahwa, dalam tipe yang lain, kita dapat mendefinisi beberapa objek padanya. Misalnya, dalan contoh sebelumnya, pada kelas Crectangle, ita dapat mendeklarasi object rectb sebagai tambahaan pada objek rect:

// example: one class, two objects
#include <iostream>
using namespace std;

class CRectangle {
int x, y;
public:
void set_values (int,int);
int area () {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: ” << rect.area() << endl;
cout << “rectb area: ” << rectb.area() << endl;
return 0;
}

rect area: 12
rectb area: 30

Dalam kasus nyata, kelas(tipe objek) yakni Crectangle, memiliki dua objek instan : rect dan rectb. Setiapnya memiliki anggota dan fungsi variabel/

perhatikan bahwa memanggil rect.area() tidak memberikan hasil yang sama dengan memanggil rectb.area(). Ini dikarenakan setiap objek kelas Crectangle memiliki variabel x dan y tersendiri, dan hal yang sama terjadi pada anggota fungsi set_value() dan area() yang setiapnya menggunakan variabel objeknya untuk beroperasi.

Ini merupakan konsep dasar dari pemrograman berorientasi objek : data dan fungsi merupakan anggota objek. Kita tidak mengg lagi variabel global yang dilewatkan dari satu fungsi ke fungsi lain sebagai parameter, melainkan kita menangani objek yang memiliki data dan fungsi tersendiri sebagai anggotanya. Perhatikan bahawa kita tidak harus selalum memberikan parameter setiap kali memanggil rect.area atau rectb.area. Fungsi anggota tersebut secara langsung menggunakan anggota data dari objek rect dan rectb.

Konstraktor dan Destrakor

Objek secara umum membutuhkan inisialisasi variabel selama proses pembuatan untuk menjadi operativ dan mencegah mengembalikan nilai yang tidak diharapkan selama dieksekusi. Contohnya, apa yang terjadi jika dalam contoh sebelumnya,kita memanggil fungsi anggota area() sebeum memanggil funsi set_values()? Mungikn ktia akan mendapatkan hasil yang tidak pasti karena anggota x dan y belum diberikan sebuah nilai.

Untukmencegah itu maka sebuah kelas akan disertakan fungsi khusus yakni constraktor, yang secara otomatis dipanggil ketika sebuah objek dari kelas dibuat. Fungsi konstraktor harus memiliki nama yang sama dengan kelas dan tidak dapat mengembalikan sebuah tipe data, tidak juga void.

Kita akan menunjukkan dalam contoh sebelumnya:

// example: class constructor
#include <iostream>
using namespace std;

class CRectangle {
int width, height;
public:
CRectangle (int,int);
int area () {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: ” << rect.area() << endl;
cout << “rectb area: ” << rectb.area() << endl;
return 0;
}

rect area: 12
rectb area: 30

Seperti yang dapat dilihat, hasil dari contoh tersebut sama dengan sebelumnya. Namun kita telah memindahkan fugsi anggota set_values(), dan telah memasukkan sebuah konstraktor yang menampilkan aksi yang sama: ia menginisialisasi nilai x dan y dengan parameter yang diberikan padanya.

Perhatikan bagaimana argumen dipassing ke constraktor pada saat objek dibuat.

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

Konstraktor tidak bisa dipanggil langsung seperti fungsi anggota umum. Mereka hanya bisa dijalankan ketika sebuah objek baru pada kelas dibuat.

Anda dapat melihat bagaimana deklarasi prototye konstraktor(dalam kelas) dan definisi konstraktor tidak mengembalikan nilai, bahkan void pun tidak.

Destraktor memenuhi fungsi sebaliknya. Ini akan secara otomatis dipanggil ketika sebuah objek dihancurkan, karena lingkup keberadaannya telah selesai(misalnya, ketika kita mendefinisi sebagai objek lokal dalam sebuah fungsi dan akhir fungsi) atau karena ini merupakan objek yang dinamik ditugasi, dan ini merilis menggunakan operator delete.

Destraktor harus memiliki nama yang sama dengan kelas, namun diawali dengan tanda ~ dan tidak boleh mengembalikan nilai.

Penggunaan destraktor secara khusus cocok ketiak sebuah objek menjalankan memori dinamis selama jalannya dan kemudian dihancurkan ketika kita ingin melepaskan memori objek yang telah dialokasi.

// example on constructors and destructors
#include <iostream>
using namespace std;

class CRectangle {
int *width, *height;
public:
CRectangle (int,int);
~CRectangle ();
int area () {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: ” << rect.area() << endl;
cout << “rectb area: ” << rectb.area() << endl;
return 0;
}

rect area: 12
rectb area: 30

Overloading Constructor

seperti fungsi lainnya, sebuah konstraktor juga bisa dilebihkan dengan lebihd ari satu fungsi yang memiliki nama yang sama namun tipe dan jumlah parameter yang berbeda. Ingat bahwa pada fungsi overloading, kompiler akan memanggil satu dari parameter yang cocok dengan argumen yang digunakan pada pemanggilan fungsi. Pada kasus konstraktor, yang secara otomatis dipanggil ketika objek dibuat, satu dijalankan adalah yang paling cocok dengan argumen yang dipassing pada deklarasi objek:

// overloading class constructors
#include <iostream>
using namespace std;

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: ” << rect.area() << endl;
cout << “rectb area: ” << rectb.area() << endl;
return 0;
}

rect area: 12
rectb area: 25

Dalam kasus ini, rectb harus dideklarasi tanpa argumen, jadi ini telah diinisialisasi dengan konstraktor yang tidak memiliki parameter, dimana inisialisasi baik width dan height dengan nilai 5.

Penting: perhatikan bahwa jika kita deklarasi sebuah objek baru dan kita ingin menggunakannya sebagai konstraktor default( satu tanpa parameter) kita tidak perlu menambahkan kurung kurawal();

CRectangle rectb; // right
CRectangle rectb(); // wrong!

Default Constructor
Jika anda tidak mendeklarasi sebuah konstraktor pada definisi kelas, kompiler mengasumsikan kelas memiliki konstraktor default tanpa argumen. Jadi, setelah deklarasi kelas seperti berikut:

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

Kompiler berasumsi bahwa Cexample memiliki konstraktor default, jadi Anda akan mendeklarasi objek pada kelas ini dengan deklarasi singkat tanpa argumen apapun:

Cexample ex;

Namun sesaat setelah dideklarasi denga konstraktor sendiri pada sebuah kelas, kompiler tidak menyediakan konstraktor default secara implisit. Jadi anda harus mendeklarasi semua objek dari kelas sesuai dengan prototype konstraktor yand didefinisi pada kelas:

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

Kita telah mendeklarasi sebuah konstraktor yang meliputi dua parameter bertipe int. OKI deklarasi objek berikut akan benar:

CExample ex (2,3);

tetapi

CExample ex;

akan salah, karena kita telah mendeklarasi kelas memiliki konstraktor eksplisit, jadi menggantikan konstraktor default.

Tetapi kompiler tidak hanya membuat default konstraktor untuk anda jika anda tidak membuatnya sendiri. Kompiler akan menyediakan tiga fungsi anggota khusus bahwa jika tidak dideklarasi sendiri. Ini berupa copy constructor, copy assignment operator, dan default destructor.

Copy constructor dan copy assignment operator menggandakan semua data yang ada dalam objek lain pada anggota data di objek saat ini. Pada Cexample, konstraktor kopi dideklarasi secara implisit oleh compiler seperti berikut:

CExample::CExample (const CExample& rv) {
a=rv.a; b=rv.b; c=rv.c;
}

OKI, deklarasi objek berikut akan benar:

CExample ex (2,3);
CExample ex2 (ex); // copy constructor (data copied from ex)

Pointers To Classes

ini secara sempurna sah untuk membuat pointer yang menunjuk kelas. Secara sederhana kita menyadari bahwa sekali dideklarasi, sebuah kelas menjadi bertipe valid, jadi kita bisa menggunakan nama kelas sebagai tipe dari pointer. Misalnya:

Crectangle * prect;

Merupakan sebuah pointer pada objek kelas Crectangle/

Seperti terjadi pada struktur data, untuk menunjuk langsung anggota dari objek yang ditunjuk oleh pointer, kita bisa menggunakan operator pana(->). Ini merupakan contoh dengan beberapa kombinasi:

// pointer to classes example
#include <iostream>
using namespace std;

class CRectangle {
int width, height;
public:
void set_values (int, int);
int area (void) {return (width * height);}
};

void CRectangle::set_values (int a, int b) {
width = a;
height = b;
}

int main () {
CRectangle a, *b, *c;
CRectangle * d = new CRectangle[2];
b= new CRectangle;
c= &a;
a.set_values (1,2);
b->set_values (3,4);
d->set_values (5,6);
d[1].set_values (7,8);
cout << “a area: ” << a.area() << endl;
cout << “*b area: ” << b->area() << endl;
cout << “*c area: ” << c->area() << endl;
cout << “d[0] area: ” << d[0].area() << endl;
cout << “d[1] area: ” << d[1].area() << endl;
delete[] d;
delete b;
return 0;
}

rect area: 12
rectb area: 25

a area: 2
*b area: 12
*c area: 2
d[0] area: 30
d[1] area: 56

Berikut, ringkasan bagaimana membaca beberapa pointer dah operator kelas yang muncul dalam contoh sebelumnya:

Pastikan bahwa Anda mengerti logika dalam ekspresi-ekspresi sebelumnya sebelum memulai bagian berikut. Jika Andar ragu, baca kembali baigan ini dan/atau konsultasi pada bagian sebelumnya soal pointer dan struktur data.

Classes defined with struct and Union

Kelas dapat didefinisi tidak hanya dengan kata kunci class tapi juga struct dan union.

Konsep kelas dan struktur data sama bahwa kedua kata kunci(struct dan class) bisa digunakand alan C++ untuk deklarasi kelas. Perbedaannya hanyalah anggota kelas dideklarasi dengan kata kuni struct memiliki hak akses public secara default, sedangkan pada kelas dideklarasi secara default dengan hak akses private. Untutuk persoalan lain, keduanya sama.

Konsep union berbeda dengan kelas dan struct, karena union hanya menyimpan satu data anggota pada waktunya, walaupun begitu mereka juga merupakan kelas, dan bisa jadi menangani anggota fungsi. Secara default hak akses dalam kelas union adalah public.



No Responses Yet to “Tutorial C++ : Kelas part I”

  1. Tinggalkan sebuah Komentar

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s


%d blogger menyukai ini: