C++ - Mengenal Friend - nblognlife

C++ - Mengenal Friend

Contoh Program C++ Mengenal Friend

     Seperti kita ketahui bahwa pada OOP bagian private dan protected tidak dapat diakses oleh fungsi bukan anggota. Namun C++ menyediakan suatu keyword yang memiliki hak 'istimewa' untuk melakukan hal tersebut, yaitu friend.

     Perlu diketahui bahwa ketika suatu fungsi dideklarasikan pada suatu kelas dengan menggunakan keyword friend maka fungsi tersebut berdiri sebagai fungsi bebas (bukan anggota dari kelas tersebut).  Untuk penjelasan lebih lanjut tentang friend akan disampaikan kembali bersama contoh programnya. Pada postingan ini saya akan membahas friend function dan friend class.

FRIEND FUNCTION
*maksudnya adalah friend yang digunakan pada fungsi
     Fungsi yang dideklarasikan sebagai friend function dapat kita gunakan untuk mengakses anggota private dan protected dari suatu kelas.

Bentuk penulisan:
friend <nilai balik + nama fungsi> (argumen){ ... }

Berikut adalah contoh program friend function.
/*
      C++ - Mengenal Friend
      Microsoft visual Studio Express 2012
      [RS]
*/

#include <iostream>
#include <conio.h>
using namespace std;

//kelas Nilai
class Nilai
{
private:
      int jum;

public:
      void inisialisasi(int jumlah);

      //friend function
      friend void tampilkan(Nilai obj);
};

int main()
{
      //penciptaan objek Nilai
      Nilai nl;
     
      cout<<"FRIEND FUNCTION"<<endl;
      cout<<"-------------"<<endl;

      //panggil fungsi 'inisialisasi' anggota dari kelas Nilai
      nl.inisialisasi(12);

      cout<<"\nMengubah dan menampilkan nilai dengan friend function"<<endl;
     
      //panggil friend function 'tampilkan' dengan menggunakan argumen berupa object dari kelas Nilai
      tampilkan(nl);

      _getche();
      return 0;
}

void Nilai::inisialisasi(int jumlah)
{
      //pemberian nilai sesuai argumen untuk memanggil fungsi inisialisasi
      jum = jumlah;
      cout<<"Nilai awal variabel jum     : "<<jum<<endl;
}

void tampilkan(Nilai obj)
{
      //mengakses dan mengubah nilai variabel jum
      obj.jum = 64;
      cout<<"Nilai variabel jum sekarang : "<<obj.jum<<endl;
}

Output
FRIEND FUNCTION
---------------
Nilai awal variabel jum     : 12

Mengubah dan menampilkan nilai dengan friend function
Nilai variabel jum sekarang : 64

Penjelasan
     Pada program di atas, friend function ‘tampilkan’ dideklarasikan pada kelas yang memperbolehkan anggota private dan protectednya boleh diakses oleh fungsi tersebut, yaitu pada kelas Nilai.

     Perhatikan output program, melalui friend function nilai dari variabel ‘jum’ diubah kemudian ditampilkan meskipun di sana tidak ada pewarisan yang dilakukan oleh kelas Nilai. Walaupun dilakukan pewarisan pun anggota private tetap saja tidak diwariskan dan tidak dapat diakses di luar kelas Nilai. Itulah hak akses ‘istimewa’ yang dimiliki oleh friend.

     Kembali pada code program. Seperti yang saya sampaikan sebelumnya friend function berdiri sebagai fungsi bebas (bukan anggota dari kelas yang mendeklarasikan). Oleh karena itu pemanggilan fungsi dan penulisan definisi fungsi tidak didahului dengan nama objek atau nama kelas. Lagi, jika Anda menggunakan IDE baru, ketika Anda mengetikan nama objet kemudian diikuti dengan titik (.), maka varibel-varibel dan fungsi-fungsi yang terdapat di dalam kelas akan keluar dalam bentuk list.  Ketika saya melakukan hal tersebut menggunakan objek ‘nl’ yang berada di dalam list hanya varaibel ‘jum’ dan fungsi ‘inisialisasi’, namun nama function friend ‘tampilkan’ tidak muncul. Hal tersebut kembali membuktikan bahwa function friend tidak menjadi bagian dari suatu kelas.  


FRIEND CLASS
*maksudnya adalah friend yang digunakan pada class
     Apabila suatu kelas yang dideklarasikan sebagai friend dari kelas lain maka kelas tersebut dapat untuk mengakses anggota private dan protected dari kelas yang mendeklarasikannya. Misal kita punya suatu kelas dengan nama kelas B yang menjadi friend dari kelas A, maka kelas B dapat mengakses anggota private dan protected dari kelas A (meski tidak dilakukan pewarisan). Tetapi tidak berlaku sebaliknya. Kelas A tidak dapat mengakses anggota dari kelas B.

Bentuk penulisan:
friend class <nama_kelas>;

Berikut adalah contoh program friend class.
/*
      C++ - Mengenal Friend
      Microsoft visual Studio Express 2012
      [RS]
*/

#include <iostream>
#include <conio.h>
using namespace std;

//kelas GedungA
class GedungA
{
private:
      int luasGA;
public:
      GedungA(int lsa)
      {
            luasGA = lsa;
      }

      friend class GedungB;
};

//kelas GedungB
class GedungB
{
private:
      int luasGB;
public:
      GedungB(int lsb)
      {
            luasGB = lsb;
      }

      void luas_gedungAB(GedungA obj);
};

int main()
{
      GedungA gdA(117);
      GedungB gdB(53);

      cout<<"FRIEND CLASS"<<endl;
      cout<<"------------"<<endl;
      cout<<endl;

      //memanggil fungsi luas_gedungAB dengan argumen berupa objek dari kelas GedungA
      gdB.luas_gedungAB(gdA);

      _getche();
      return 0;
}

//definisi fungsi luas_gedungAB
void GedungB::luas_gedungAB(GedungA obj)
{
      int total;
      total = obj.luasGA + luasGB;

      cout<<"Luas Gedung A : "<<obj.luasGA<<endl;
      cout<<"Luas Gedung B :  "<<luasGB<<endl;
      cout<<"------------------- +"<<endl;
      cout<<"Total         : "<<total<<endl;
}

Output
FRIEND CLASS
------------

Luas Gedung A : 117
Luas Gedung B :  53
------------------- +
Total         : 170


Penjelasan
     Seperti yang saya sampaikan sebelumnya, terlihat bahwa kelas GedungB dapat mengakses anggota private dari kelas Gedung A. Hal tersebut karena kelas GedungB telah dideklarasikan sebagai friend dari kelas A.
     Coba hilangkan friend class GedungB;, maka akan muncul pesan error pada fungsi ‘luas_gedungAB’ tepatnya ketika pengaksesan variabel luasGA dilakukan. Mengapa demikian? Ingat! Anggota yang bersifat private hanya boleh diakses oleh kelas yang mendefinisikan saja. Namun, dengan adanya hak ‘istimewa’ yang dimiliki oleh friend hal tersebut menjadi boleh untuk dilakukan.

Penting!
Friend function dan friend class ditempatkan pada kelas yang memperbolehkan anggota private dan protectednya untuk diakses. Logikanya sama dengan ketika kita memberi izin kepada teman kita untuk menggunakan barang milik kita. Kitalah yang berhak memberikan izinnya dan kitalah yang memberitahukan pada lingkungan bahwa dia adalah teman kita yang sudah kita izinkan untuk menggunakan barang milik kita.

Baca juga:
C++ - Inheritance (Dasar Pewarisan) 

[RS]

Klik Like & Share jika postingan ini bermanfaat
Apa tanggapan Anda?

Berikan tanggapan Anda melalui kolom komentar yang telah disediakan.
- Gunakan bahasa yang sopan;
- Saat menjadikan postingan pada blog ini sebagai referensi, jangan lupa mencantumkan sumbernya (link dari blog ini).

Jika blog ini bermanfaat jangan lupa memberikan 'like' atau 'share' untuk mendapatkan update terbaru.

Terima kasih