Freundeserklärung in C ++ - Unterschied zwischen öffentlich und privat

141

Gibt es einen Unterschied zwischen der Deklaration einer Freundfunktion / -klasse als privat oder öffentlich? Ich kann online anscheinend nichts darüber finden.

Ich meine den Unterschied zwischen:

class A
{
 public: 
      friend class B;
 };

und

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

Ist da ein Unterschied?

BIU
quelle
28
Solche Fehlinformationen ... jemand hat es nicht verdient, ein Freund zu sein. Es liegt ganz bei Ihnen, ob Sie Ihre Freunde mögen, die in Ihrem Privatleben stecken.
Tony Delroy
Darf ich fragen, was eine Freundesklasse ist: '(?
I Phantasm I
3
@I Phantasm - Dies ist eine Deklaration, mit der eine Instanz der friendKlasse auf die Mitglieder zugreifen kann, die privatein der Klasse deklariert sind , die die Deklaration abgegeben hat. In diesem Beispiel kann eine Instanz der Klasse B
BIU vom
2
Diese Frage hat mir viel zu viele Punkte auf dieser Seite eingebracht. Also gut.
BIU

Antworten:

138

Nein, es gibt keinen Unterschied - Sie sagen nur, dass Klasse B ein Freund von Klasse A ist und jetzt auf ihre privaten und geschützten Mitglieder zugreifen kann, das ist alles.

scharfer Zahn
quelle
5
Ich denke also, wer mir das gesagt hat, wusste einfach nicht, wovon sie sprachen. Danke :)
BIU
Würden Sie zu Dokumentationszwecken friendein Implementierungsdetail oder einen Teil der Schnittstelle in Betracht ziehen ?
TemplateRex
1
@TemplateRex: IMO, das Teil der Schnittstelle ist - es ist eine ziemlich starke Behauptung, dass es einige (zufällige) gibt, class Frienddie auf alle privaten Mitglieder der aktuellen Klasse zugreifen können.
Scharfzahn
für zufällige Klasse ja. Angenommen, Sie implementieren operator==(T, T)mit privaten Datenelementen von Tund verwenden diese friendals Implementierungsdetail, damit operator==sie als Nichtmitglied angezeigt werden können. IMO, diese Freundschaft sollte nicht in der öffentlichen Oberfläche erscheinen (wie zB von Doxygen generiert wird)
TemplateRex
Ich habe hier vor einiger Zeit hier im Stackoverflow gelesen, dass einige Compiler, ich denke einige alte, fehlerhafte, verwirrt werden, wenn eine Freundeserklärung in einer nicht öffentlichen Region erfolgt.
Peregring-lk
35

Da die Syntax friend class Bkein Mitglied der Klasse deklariert A, spielt es keine Rolle, wo Sie sie schreiben, ist class Bein Freund der Klasse A.

Wenn Sie friend class Bin protectedAbschnitt von schreiben A, bedeutet dies NICHT, dass Bnur protectedund publicMitglieder von zugreifen können A.

Denken Sie immer daran, dass Bein Freund von A, auf den er schreibt, auf jedes Mitglied zugreifen kannA , unabhängig davon, in welchem ​​Abschnitt Sie schreiben friend class B.

Nawaz
quelle
3
Ich denke also, wer mir das gesagt hat, wusste einfach nicht, wovon sie sprachen. Danke :)
BIU
-1

Die Freunddeklaration wird in einem Klassenkörper angezeigt und gewährt einer Funktion oder einer anderen Klasse Zugriff auf private und geschützte Mitglieder der Klasse, in der die Freunddeklaration angezeigt wird.

Als solche haben Zugriffsspezifizierer keinen Einfluss auf die Bedeutung von Freundesdeklarationen (sie können in privaten: oder öffentlichen: Abschnitten ohne Unterschied erscheinen).

goyuiitv
quelle
Beantwortung einer sieben Jahre alten Frage, ohne neu zu sein. Bitte nehmen Sie weg von der Vervielfältigung.
MAChitgarha