Deklarasi teman di C ++ - perbedaan antara publik dan pribadi

151

Apakah ada perbedaan antara mendeklarasikan fungsi / kelas teman sebagai privat atau publik? Sepertinya saya tidak dapat menemukan apa pun tentang ini secara online.

Maksud saya perbedaan antara:

class A
{
 public: 
      friend class B;
 };

dan

class A
{
 private: //or nothing as the default is private
      friend class B;
 };

Apakah ada bedanya?

BIU
sumber
30
Informasi yang salah ... seseorang tidak pantas menjadi teman. Itu sepenuhnya terserah Anda apakah Anda suka teman-teman Anda menyelinap dengan kemaluan Anda.
Tony Delroy
bolehkah saya bertanya apa itu teman kelas: '(?
I Phantasm I
4
@I Phantasm - ini adalah deklarasi yang memungkinkan sebuah instance friendkelas mengakses anggota yang dideklarasikan privatedi kelas yang membuat deklarasi tersebut. Dalam kasus contoh ini, instance kelas B dapat mengakses anggota privat kelas A
BIU
2
Pertanyaan ini memberi saya terlalu banyak poin di situs ini. Baiklah kalau begitu.
BIU

Jawaban:

147

Tidak, tidak ada perbedaan - Anda cukup memberi tahu bahwa kelas B adalah teman kelas A dan sekarang dapat mengakses anggotanya yang pribadi dan dilindungi, itu saja.

gigi tajam
sumber
5
jadi saya kira siapa pun yang memberi tahu saya bahwa tidak tahu apa yang mereka bicarakan. Terima kasih :)
BIU
tetapi untuk tujuan dokumentasi, apakah Anda akan mempertimbangkan frienddetail implementasi atau bagian dari antarmuka?
TemplateRex
1
@TemplateRex: IMO yang merupakan bagian dari antarmuka - klaim yang cukup kuat bahwa ada beberapa (acak) class Friendyang dapat mengakses semua anggota privat kelas saat ini.
gigi tajam
untuk kelas acak, ya. Tetapi katakanlah Anda mengimplementasikan operator==(T, T)menggunakan anggota data pribadi T, dan menggunakan friendsebagai detail implementasi sehingga operator==dapat muncul sebagai non-anggota. IMO, pertemanan ini tidak boleh muncul di antarmuka publik (seperti yang dihasilkan oleh Doxygen misalnya)
TemplateRex
Saya membaca beberapa waktu yang lalu di stackoverflow bahwa beberapa kompiler, saya kira beberapa yang lama buggy, akan bingung jika deklarasi teman terjadi di wilayah non-publik.
Peregring-lk
37

Sejak sintaks friend class Btidak mendeklarasikan anggota kelas A, sehingga tidak peduli di mana Anda menulis itu, kelas Badalah teman kelas A.

Juga, jika Anda menulis friend class Bdi protectedbagian A, maka BUKAN berarti Bhanya dapat mengakses protecteddan publicanggota A.

Ingatlah selalu bahwa setelah Bmenjadi teman A, ia dapat mengakses setiap anggota A, tidak peduli di bagian mana Anda menulis friend class B.

Nawaz
sumber
3
jadi saya kira siapa pun yang memberi tahu saya bahwa tidak tahu apa yang mereka bicarakan. Terima kasih :)
BIU
-2

Pernyataan teman muncul di badan kelas dan memberikan fungsi atau akses kelas lain ke anggota kelas pribadi dan dilindungi tempat pernyataan teman muncul.

Karena itu penentu akses tidak berpengaruh pada arti pernyataan teman (mereka dapat muncul secara pribadi: atau di bagian umum:, tanpa perbedaan).

goyuiitv
sumber
Menjawab pertanyaan berusia tujuh tahun tanpa menjadi baru. Mohon jangan membuat hal-hal lebih diduplikasi.
MAChitgarha