Class Private , Class Public, dan Class Protected

2008 | Direktorat Pembinaan SMK 535 Program 16.8 include cstdlib include iostream using namespace std; class Titik { public: int X; int Y; }; int mainint argc, char argv[] { Titik A; A.X = 4 ; A.Y = 6 ; cout Absis titik A = A. X \n ; cout Ordinat titik A = A.Y \n ; system PAUSE ; return EXIT_SUCCESS; } Program di atas jikalau dijalankan tidak akan terjadi kesalahan, karena variabel X dan Y public jadi tidak ada penyembunyian informasi information hiding. Keluaran dari program tersebut seperti berikut: Absis titik A = 4 Ordinat titik A = 6 Tapi kalau bisa diubah dari luar maka data itu terlalu berisiko ibarat sebuah rumah bisa dimasuki orang sekehendak hati, hal ini tidak boleh terjadi. Oleh karena itu variabel tersebut harus tetap private tetapi diberi jalan masuk apabila diperlukan untuk diganti atau diubah nilainya. Program secara lengkapnya menjadi include cstdlib Program 16.9 include iostream using namespace std; class Titik { 536 Direktorat Pembinaan SMK | 2008 private: int X; int Y; public: void SetAbsisint x; void SetOrdinatint y; int AmbilAbsis; int AmbilOrdinat; }; void Titik::SetAbsisint x { X = x; } void Titik::SetOrdinatint y { Y = y; } int Titik::AmbilAbsis { return X; } int Titik::AmbilOrdinat { return Y; } int mainint argc, char argv[] { Titik A; A.SetAbsis 4 ; A.SetOrdinat 6 ; cout Absis titik A = A.AmbilAbsis \n ; cout Ordinat titik A = A.AmbilOrdinat \n ; system PAUSE ; return EXIT_SUCCESS; } 2008 | Direktorat Pembinaan SMK 537 Jadi ada dua pasang method yang ditambahkan, satu untuk memasukkan data baik X maupun Y yaitu lewat SetAbsis maupun SetOrdinat. Yang kedua untuk menampilkan atau melihat variabel X ataupun Y melalui perintah AmbilAbsis dan AmbilOrdinat. Disini terlihat bahwa pintu masuk dan keluar melalui jalur tertentu tidak bisa langsung seperti apabila variabel di set public. Ibarat super market disitu ada pintu masuk dan pintu keluar, untuk mengambil barang-barang yang ada harus melalui prosedur tidak bisa begitu saja. Dapat disimpulkan untuk mengakses data dalam suatu class yang bersifat private bisa dengan membuat method yang bersifat public sehingga bisa memanipulasi datavariabel yang ada didalamnya. Contoh lain sebagai berikut: Program 16.10 include cstdlib include iostream using namespace std; class A { private: int privat; public: int umum; int AmbilPrivat { return privat; }; void SetPrivatint data { privat = data; }; void TesA; }; void A::TesA { cout Keluaran dari TesA endl; cout Umum = umumendl; cout Private = privatendl; } class B: public A { public: void TesB; 538 Direktorat Pembinaan SMK | 2008 }; void B::TesB { cout Keluaran dari TesB endl; cout Umum = umumendl; cout Private = AmbilPrivatendl; } int mainint argc, char argv[] { A ContohA; ContohA.SetPrivat 4 ; ContohA.umum = 20 ; ContohA.TesA; coutendl Keluaran dari Main endl; cout Umum = ContohA.umumendl; cout Private = ContohA.AmbilPrivatendlendl; B ContohB; ContohB.SetPrivat 40 ; ContohB.umum = 200 ; ContohB.TesB; coutendl Keluaran dari Main endl; cout Umum = ContohB.umumendl; cout Private = ContohB.AmbilPrivatendlendl; system PAUSE ; return EXIT_SUCCESS; } Dari contoh di atas dapat dilihat perbedaan pemakaian public dan private dalam memanipulasi data di dalam class, baik dari class itu sendiri maupun dari class turunannya. Dari class sendiri yaitu class A semua variabel maupun method bisa diakses lansung, contoh method TesA. Tetapi pemanggilan dari class turunannya yaitu class B harus melalui method public-nya, contohnya pada method TesB untuk menampilkan data harus pakai AmbilPrivat tidak langsung variabel privat seperti TesA. Tetapi untuk variabel umum bisa dipanggil langsung karena sifatnya public, jadi 2008 | Direktorat Pembinaan SMK 539 tidak ada beda cara pemanggilan baik TesA maupun TesB. Sedangkan untuk pemanggilan di main baik ContohA yang merupakan class baru dari class A, dan Contoh B yang merupakan class baru dari class B tidak ada perbedaan cara pemanggilan. Bisa dimengerti karena class B merupaka turunan public dari class A. Sebenarnya masih ada satu lagi yaitu sifat protected. Suatu class yang memproteksi data-datanya dengan sifat protected hanya bisa diakses dari dirinya sendiri atau dari class turunannya. Lihat contoh berikut dan bandingkan dengan sifat private yang telah dibahas sebelumnya. Program 16.11 include cstdlib include iostream using namespace std; class A { protected: int proteksi; public: int umum; int AmbilProteksi { return proteksi; }; void SetProteksiint data { proteksi = data; }; void TesA; }; void A::TesA { cout Keluaran dari TesA endl; cout Umum = umumendl; cout Private = proteksiendl; } class B: public A { public: void TesB; }; 540 Direktorat Pembinaan SMK | 2008 void B::TesB { cout Keluaran dari TesB endl; cout Umum = umumendl; cout Protected = proteksiendl; } int mainint argc, char argv[] { A ContohA; ContohA.SetProteksi 4 ; ContohA.umum = 20 ; ContohA.TesA; coutendl Keluaran dari Main endl; cout Umum = ContohA.umumendl; cout Private = ContohA.AmbilProteksiendlendl; B ContohB; ContohB.SetProteksi 40 ; ContohB.umum = 200 ; ContohB.TesB; coutendl Keluaran dari Main endl; cout Umum = ContohB.umumendl; cout Private = ContohB.AmbilProteksiendlendl; system PAUSE ; return EXIT_SUCCESS; } Coba lihat method TesA dan TesB cara mengakses data class sama persis variabel maupun method contoh variabel umum dan variabel proteksi. Jadi class yang bersifat protected bisa diakses langsung persis seperti class tersebut melalui turunannya. Bandingkan dengan contoh sebelumnya yaitu class yang bersifat private tidak dapat diakses langsung dari turunannya. Tetapi harus melalui method yang bersifat public. Namun perlu dicermati cara macam ini mempunyai kelemahan karena data tersebut seolah-olah menjadi bersifat public meskipun dideklarasikan secara private atau protected; Untuk mengatasi masalah semacam itu, C++ menyediakan satu keyword, 2008 | Direktorat Pembinaan SMK 541 yaitu friend. Sebuah fungsi atau class yang dideklarasikan dengan sifat friend dapat mengakses semua anggota class lain, baik bersifat private, protected, maupun public.

16.4. Friend

Sebelumnya sudah di bahas bahwa ada tiga macam proteksi bagi member class, yakni: public, protected dan private. Member protected dan private tidak bisa diakses dari luar class dimana dia dideklarasikan. Walaupun demikian aturan ini dilanggar dengan adanya friend di dalam class, sehingga kita dapat membuat fungsi eksternal untuk mengakses member private dan protected. Untuk itu kita mendeklarasikan prototype fungsi eksternal yang dimaksud yang akan menambah akses sebelumnya dengan instruksi friend di dalam deklarasi class yang dapat dishare oleh semua member. Perhatikan contoh berikut dimana kita mendeklarasikan friend function duplicate: Program 16.12. Friend functions include iostream.h class CRectangle { int width, height; public: void set_values int, int; int area void {return width height;} friend CRectangle duplicate CRectangle; }; void CRectangle::set_values int a, int b { width = a; height = b; } CRectangle duplicate CRectangle rectparam { CRectangle rectres; rectres.width = rectparam.width 2 ; rectres.height = rectparam.height 2 ; return rectres; } int main { 542 Direktorat Pembinaan SMK | 2008 CRectangle rect, rectb; rect.set_values 2 , 3 ; rectb = duplicate rect; cout Hasil nya = rectb.area; } Dari fungsi duplicate yang merupakan friend dari CRectangle, kita dapat mengakses member width dan height dari objek yang berbeda dalam tipe CRectangle. Perhatikan bahwa fungsi duplicate bukan merupakan anggota dari class CRectangle Dengan friend function fungsi yang bukan merupakan anggota class diliar class dapat mengakses member class yang sifatnya privateprotected. Secara umum penggunaan fungsi friend kelihatannya keluar dari metodologi OOP, sehingga selama masih memungkinkan lebih baik menggunakan member yang classnya sama untuk masalah ini. Seperti pada contoh sebelumnya, akan lebih sederhana jika duplicate diletakkan dalam class CRectangle. Program 16.13 include iostream.h include conio.h class contoh { int x; void fcontoh; public: void fcontoh1 ; void fcontoh2 ; friend void fcontoh3 ; }; void contoh::fcontoh { cout \nFungsi fcontoh anggota class contoh, bersifat private ; } void contoh::fcontoh1 { x= 3 ; cout Fungsi contoh 1 anggota class contoh ; fcontoh; cout \nNilai x = x;} void contoh::fcontoh2 { cout \n\nFungsi contoh 2 anggota class contoh ; cout \nNilai x = x;}