Saya memiliki pemrograman berorientasi objek dengan kursus c ++ semester ini di kampus dan kami belajar tentang fungsi teman.
Saya secara naluriah tidak menyukai mereka karena kemampuan mereka untuk melewati keamanan yang disediakan Enkapsulasi dan Penyembunyian Data, saya membaca beberapa artikel di internet dan beberapa orang berpikir itu adalah ide yang bagus dengan beberapa penggunaan yang sah.
Apa yang akan dikatakan pakar OOP tentang fungsi teman di C ++? Haruskah saya membaca sepintas lalu atau saya harus belajar lebih banyak tentang itu?
c++
object-oriented
friends
nikhil
sumber
sumber
Jawaban:
Tidak selalu nyaman untuk membuat semua fungsi yang terkait dengan anggota kelas C ++ dari kelas itu. Sebagai contoh, bayangkan implementasi aljabar vektor dengan perkalian skalar. Kami ingin menulis:
Kita dapat melakukan ini dengan fungsi anggota:
Tetapi kami juga ingin menulis:
Ini membutuhkan fungsi gratis:
Kata
friend
kunci ditambahkan ke C ++ untuk mendukung penggunaan ini. Fungsi bebas adalah bagian dari implementasi kelas Vector, dan harus dinyatakan dalam header yang sama dan diimplementasikan dalam file sumber yang sama.Demikian pula kita dapat menggunakan
friend
untuk menyederhanakan implementasi kelas yang digabungkan secara ketat, seperti koleksi dan iterator. Sekali lagi, saya akan mendeklarasikan kedua kelas di header yang sama, dan mengimplementasikannya dalam file sumber yang sama.sumber
inline Vector operator*(double a, Vector v) { return v*a; }
. Solusi kanonik sebenarnya.inline Vector operator*(double a, Vector v) { return -v*a; }
dan itu masih tidak membutuhkan persahabatan.Fungsi teman tidak berbeda dengan fungsi anggota dalam hal enkapsulasi. Mereka dapat, bagaimanapun, menawarkan keuntungan lain - seperti menjadi lebih umum, terutama di mana template yang bersangkutan. Selain itu, beberapa operator hanya dapat ditentukan sebagai fungsi bebas, jadi jika Anda ingin mereka memiliki akses anggota, Anda harus
friend
.Lebih baik
friend
fungsi tunggal daripada dipaksa untuk membuat sesuatu yang Anda tidak ingin publik. Itu berarti seluruh dunia dapat menggunakannya - bukan hanya satu fungsi.sumber
friend
fungsi yang juga "pribadi", seperti hanya dinyatakan dalam TU tunggal.Jika Anda bersemangat tentang apa yang Anda lakukan, Anda akan belajar segalanya tentang C ++. Pelajari untuk apa mereka digunakan, bagaimana menggunakannya, dan kemudian - dan hanya kemudian - memutuskan untuk tidak menggunakannya. Paling tidak, Anda akan siap ketika membaca kode orang lain yang menggunakan aspek C ++ ini.
sumber
" Apa yang akan dikatakan ahli OOP ... " Sebagian besar tergantung pada seberapa ahli dia dalam C ++, bahwa -dengan spesifikasinya sendiri - bukan (dan tidak ingin) bahasa untuk purist.
OOP Zelot tidak menggunakan C ++ (mereka lebih suka Smalltalk, dan seperti Java).
Zelots pemrograman fungsional tidak menggunakan C ++ (mereka lebih suka LISP, dan penggantinya)
Sebagian besar pakar OOP tidak menyukai fungsi teman hanya karena mereka ingin bagian OOP C ++ berperilaku seperti Smalltalk. Tetapi C ++ bukan Smalltalk, dan mereka bahkan tidak dapat mengerti bahwa teman tidak merusak enkapsulasi , karena alasan yang sangat sederhana bahwa suatu fungsi tidak dapat menjadi teman kelas Anda tanpa kelas Anda menginginkannya .
Dan dari sudut pandang "fungsionalitas", antara
a.fn(b)
danfn(a,b)
tidak ada perbedaan (di manafn
ada teman): pihak yang terlibat adalah sama. Sederhananya, satu sintaks mungkin lebih cocok daripada yang lain: jika fn bersifat komutatifa
danb
,fn(a,b)
mungkin lebih cocok kemudiana.fn(b)
(di mana penampilan memiliki "peran khusus" yang, pada kenyataannya, tidak.)sumber
sumber
The C ++ FAQ adalah ringkas:
FAQ menyajikan salah satu cara berpikir yang lebih berguna tentang persahabatan:
Mungkin penggunaan fungsi teman yang paling umum adalah kelebihan << untuk I / O.
sumber
Fungsi teman paling baik digunakan untuk definisi operator yang ditentukan pengguna. Mereka berguna dalam situasi lain, tetapi jika Anda mendapati diri Anda sering menentukan kelas teman maka Anda mungkin akan mengambil jalan memutar (hanya pemeriksaan diri yang baik untuk digunakan saat menulis kode).
Berhati-hatilah dengan pernyataan "keamanan" dalam pertanyaan awal. Akses pengubah ada untuk mencegah Anda menulis kode buruk secara tidak sengaja, seperti halnya kompiler. Pengubah akses membatasi antarmuka, dan berfungsi untuk mengkomunikasikan fungsi apa yang penting untuk menggunakan kelas (publik dan terlindungi), dan mana yang dibuat sebagai bagian dari membuat kelas lebih cantik untuk pengelola (pribadi). Pengubah bukan merupakan keamanan karena ada banyak cara untuk mendapatkan data pribadi. Misalnya, dapatkan pointer ke kelas dan ukurannya, dan pergi memancing.
sumber
Fungsi teman C ++ terkait erat dengan fungsi berikut:
Ini berarti bahwa mereka tidak memiliki pointer-ini dan dengan demikian berada di luar kelas / objek. Di sisi lain, mereka sering mengambil parameter yang membuat mereka kembali menjadi bagian dari kelas. Berikut beberapa contoh yang menjelaskan tautan:
Satu-satunya perbedaan antara fungsi statis dan fungsi teman adalah bahwa fungsi teman dapat menggunakan beberapa kelas.
Menggunakan mekanisme pertemanan di c ++ membutuhkan programmer yang memiliki pengalaman sekitar 10-15 tahun dengan cara pemrograman c ++, dan karenanya pada awalnya Anda harus menghindarinya. Ini fitur canggih.
sumber