Friend pada C++

“Sahabat sejatiku, hilangkah dari ingatanmu. Di hari kita saling berbagi
Dengan kotak sejuta mimpi, aku datang menghampirimu
Kuperlihatkan semua hartaku
Sheila On 7 – Sahabat Sejati

Kalimat “kuperlihatkan semua hartaku” di atas sengaja ditulis tebal sebagai penekanan atas materi yang akan kita pelajari kali ini. Kita semua pasti memiliki teman, tempat kita bisa berbagi dan curhat tentang apa saja, suka duka, keluh kesal, bahkan hal-hal yang cukup privasi. Seperti itulah friend pada C++ yang akan kita pelajari kali ini!

Friend pada C++ adalah sebuah fungsi atau kelas yang diizinkan mengakses atribut maupun metode satu atau lebih kelas lain nyang menjadi temannya walaupun atribut dan metode yang diakses memiliki izin akses private atau protected. Friend sebenarnya melanggar aturan pemrograman berorientasi objek tentang enkapsulasi dimana izin akses private dan protected tidak sembarang bisa diakses oleh kelas lain, namun tujuan dari adanya friend adalah memudahkan programmer untuk merancang kelas-kelas yang akan dibuat, terutama dalam tahap pengembangan. Penggunaan friend tidak terlalu dianjurkan.

FUNGSI / PROSEDUR FRIEND

Sebuah friend yang bukan member dari suatu kelas masih dimungkinkan untuk dapat mengakses fungsi dari kelas tersebut walaupun izin aksesnya private maupun protected, asalkan fungsi tersebut dinyatakan sebagai fungsi friend bagi kelas yang bersangkutan. Lebih dari itu, sebuah fungsi dapat menjadi fungsi friend bagi beberapa kelas sekaligus, sehingga dapat mengakses member-member dari kelas-kelas tersebut sekaligus.

Untuk dapat menyatakan sebuah fungsi sebagai fungsi friend bagi satu kelas, cukup tambahkan kata kunci friend di depan nama fungsi tersebut di dalam kelas yang bersangkutan.

// Contoh 1 Fungsi Friend – CRectangle.cpp

#include <iostream>

using namespace std;

class CPersegi
{
 private:
 int sisi;
 public:
 void setSisi(int s);
 int luas();
 friend CPersegi duplikat(CPersegi persegi1); //fungsi friend
};

void CPersegi::setSisi(int s)
{
 this->sisi = s;
}

int CPersegi::luas()
{
 return this->sisi * this->sisi;
}

CPersegi duplikat(CPersegi persegi1)
{

 CPersegi persegi2;

 persegi2.sisi = persegi1.sisi;

 return (persegi2);
}

int main()
{
 CPersegi persegiA, persegiB;

persegiA.setSisi(3);
 persegiB = duplikat(persegiA);

cout<<persegiB.luas()<<endl;

 return 0;
}

Ouput :

Fungsi duplikat() di atas adalah fungsi friend dari kelas CPersegi. Dengan menggunakan fungsi duplikat() tersebut, kita dapat mengakses member sisi dari kelas CPersegi, walaupun hak aksesnya private. Perhatikan ketika kita mendeklarasikan fungsi duplikat() dan menggunakannya dalam fungsi main(),
fungsi duplikat() bukanlah member dari kelas CPersegi()!
Fungsi duplikat() memiliki hak untuk mengakses member private dan protected tanpa harus menjadi member kelas tersebut.

Untuk diingat!
Dalam C++, saat kita mendefinisikan method suatu class di luar deklarasi class itu sendiri, kita harus menambahkan dua titik dua “::”.
http://www.cplusplus.com/doc/tutorial/classes/

Fungsi friend dapat digunakan untuk menghubungkan dan melakukan operasi antara dua kelas yang berbeda. Secara umum, penggunaan fungsi friend tidak termasuk dalam metodologi Pemrograman Berorientasi Objek, jadi bila dimungkinkan lebih baik menggunakan member dari kelas yang sama untuk melakukan operasi dengan mereka. Seperti pada contoh sebelumnya, kita dapat langsung mengintegrasikan fungsi duplikat() ke dalam kelas CPersegi. Sehingga kodenya menjadi berikut :


#include <iostream>

using namespace std;

class CPersegi
{
 private:
 int sisi;
 public:
 void setSisi(int s);
 int luas();
 CPersegi duplikat();
};

void CPersegi::setSisi(int s)
{
 this->sisi = s;
}

int CPersegi::luas()
{
 return this->sisi * this->sisi;
}

CPersegi CPersegi::duplikat()
{

 CPersegi persegi2;

 persegi2.sisi = this->sisi;

 return (persegi2);
}

int main()
{
 CPersegi persegiA, persegiB;

persegiA.setSisi(3);
 persegiB = persegiA.duplikat();

cout<<persegiB.luas()<<endl;

 return 0;
}


// Contoh 2 Fungsi Friend – CTitik3D.cpp

#include <iostream>

using namespace std;

class CTitik3D;

class CTitik
{
 private:
 int x,y;
 public:
 CTitik(int xi, int yi) //konstruktor
 {
 this->x = xi;
 this->y = yi;
 }
 friend void tampilkanTitik(CTitik t1, CTitik3D t2); //fungsi friend
};

class CTitik3D : public CTitik
{
 private:
 int z;
 public:
 CTitik3D(int xi, int yi, int zi) //konstruktor
 {
 setX(xi);
 setY(yi);
 this->z = zi;
 }
 friend void tampilkanTitik(CTitik t1, CTitik3D t2); //fungsi friend
 protected:
 int getZ()
 {
 return this->z;
 }
};

//fungsi friend
void tampilkanTitik(CTitik t1, CTitik3D t2)
{
 cout<<"Fungsi Friend"<<endl<<endl;
 cout<<"Titik"<<endl;
 cout<<" x : "<<t1.x<<endl;
 cout<<" y : "<<t1.y<<endl<<endl;
 cout<<"Titik3D"<<endl;
 cout<<" x : "<<t2.x<<endl;
 cout<<" y : "<<t2.y<<endl;
 cout<<" z : "<<t2.z<<endl;
}

int main()
{
 CTitik t1 (23, 3);
 CTitik3D t2 (3, 6, 94);

 tampilkanTitik(t1,t2);

 return 0;
}

Ouput :

Pada contoh kode program kedua, kelas CTitik3D dideklrasikan terlebih dahulu di atas kelas CTitik agar kelas CTitik3D dapat dikenali oleh kelas CTitik. Prosedur tampilkanTitik() merupakan prosedur friend dari kelas CTitik dan CTitik3D yang dideklarasikan sebagai prosedur friend di daam kelas CTitik dan CTitik3D.

KELAS FRIEND

Kelas friend adalah kelas yang setiap anggota dan fungsinya merupakan fungsi friend dari kelas yang bersangkutan, sehingga anggota kelas friend tersebut dapat mengakses anggota dan fungsi kelas lain walaupun memiliki hak akses private maupun protected. Misalkan kelas friend dari kelas B dideklarasikan sebagai berikut :


friend class A;

Dengan begitu, setiap anggota dan fungsi dari kelas A akan diberikan hak friend untuk mengakses atribut dan fungsi kelas B. Kode dibawah adalah contoh dari kelas friend :


// Contoh 3 Fungsi Friend – Cteman.cpp
#include <iostream>
using namespace std;

class YourClass{
 friend class YourOtherClass; // Deklarasi kelas Friend
 private:
 int topSecret;
 public:
 YourClass() : topSecret(0){}
 void printMember() { cout << topSecret << endl; }
};

class YourOtherClass {
 public:
 void change( YourClass& yc, int x ){yc.topSecret = x;}
};

int main() {
 YourClass yc1;
 YourOtherClass yoc1;
 yc1.printMember();
 yoc1.change( yc1, 3 );
 yc1.printMember();
 return 0;
}

Ouput :

Fitur friend tidak saling silang (terhubung bolak-balik) kecuali jika telah dideklrasikan terlebih secara eksplisit. Pada contoh di atas, kelas YourClass tidak dapat mengakses atribu kelas YourOtherClass.

Friend tidak sama dengan inheritance, yang berarti turunan dari kelas YourOtherClass tidak akan bisa mengakses atribut private dan protected kelas YourClass. Friend juga tidak transitif, sehingga kelas yang merupakan friend dari YourOtherClass tidak dapat mengakses anggota pribadi YourClass itu.

Gambar berikut menunjukkan deklarasi empat kelas : Base, Derived, aFriend, dan anotherFriend. Hanya kelas aFriend yang memiliki akses langsung ke anggota private
Base (dan untuk setiap atribut Base yang mungkin telah diwariskan).


KESIMPULAN

Friend adalah salah satu dari banyaknya fitur yang disediakan oleh bahasa pemrograman C++. Dengan menggunakan friend, kita dapat mengakses atribut kelas lain walau yang private sekalipun. Perlu ditekankan sekali lagi, penggunaan friend tidak terlalu dianjurkan karena dapat mengurangi makna enkapsulasi dari pemrograman berorientasi objek dan dapat menyebabkan masalah pada desain arsitektur keseluruhan.

oleh Arief Rahmansyah
Artificial Intelligence Research Laboratory Fasilkom Unsri

Download dokumen : Friend pada C++

Referensi

cplusplus.com. (2013, January 30). Classes (I) – C++ Documentation. Retrieved from cpluspluc.com: http://www.cplusplus.com/doc/tutorial/classes/

cplusplus.com. (2013, January 2013). Friendship and Inheritance – C++ Documentation. Retrieved from cplusplus.com: http://www.cplusplus.com/doc/tutorial/inheritance/

Drs. Megah Mulya, M. (2007). Bahan Ajar Pemrograman Berorientasi Objek.

Mirosoft. (2013, January 31). Class Member Functions and Classes as Friends. Retrieved from msdn: http://msdn.microsoft.com/en-US/library/ahhw8bzz(v=vs.80).aspx

Rosa A. S., M. Shalahuddin. (2010). Pemrograman Berorientasi Objek dengan Bahasa Pemrograman C++, PHP, dan Java. Bandung: Modula.

Wikimedia Foundation, I. (2013, January 31). Friend function. Retrieved from Wikipedia: http://en.wikipedia.org/wiki/Friend_function

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s