Déclaration d'ami en C ++ - différence entre public et privé

144

Y a-t-il une différence entre déclarer une fonction / classe amie comme privée ou publique? Je n'arrive pas à trouver quoi que ce soit à ce sujet en ligne.

Je veux dire la différence entre:

class A
{
 public: 
      friend class B;
 };

et

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

Y a-t-il une différence?

BIU
la source
29
Une telle désinformation ... quelqu'un ne méritait pas d'être un ami. C'est à vous de décider si vous aimez que vos amis se retrouvent avec vos soldats.
Tony Delroy
puis-je demander ce qu'est une classe d'amis: '(?
I Phantasm I
3
@I Phantasm - c'est une déclaration qui permet à une instance de la friendclasse d'accéder aux membres déclarés privatedans la classe qui a fait la déclaration. Dans le cas de cet exemple, une instance de la classe B peut accéder aux membres privés de la classe A
BIU
2
Cette question m'a valu beaucoup trop de points sur ce site. Très bien alors.
BIU

Réponses:

141

Non, il n'y a pas de différence - vous dites simplement que la classe B est un ami de la classe A et peut désormais accéder à ses membres privés et protégés, c'est tout.

dents acérées
la source
5
donc je suppose que quiconque m'a dit ça ne savait tout simplement pas de quoi ils parlaient. Merci :)
BIU
mais à des fins de documentation, envisageriez-vous un frienddétail d'implémentation ou une partie de l'interface?
TemplateRex
1
@TemplateRex: IMO qui fait partie de l'interface - c'est une affirmation assez forte selon laquelle certains (aléatoires) class Friendpeuvent accéder à tous les membres privés de la classe actuelle.
Sharptooth
pour une classe aléatoire, oui. Mais disons que vous implémentez en operator==(T, T)utilisant des données privées membres de T, et que vous l'utilisez friendcomme détail d'implémentation afin que cela operator==puisse apparaître comme non-membre. IMO, cette amitié ne devrait pas apparaître dans l'interface publique (comme sera généré par Doxygen par exemple)
TemplateRex
J'ai lu il y a quelque temps ici dans stackoverflow que certains compilateurs, je suppose que certains vieux bogués, seront confus si une déclaration d'ami se produit dans une région non publique.
Peregring-lk
36

Comme la syntaxe friend class Bne déclare pas un membre de la classe A, peu importe où vous l'écrivez, la classe Best un ami de la classe A.

En outre, si vous écrivez friend class Ben protectedsection A, il ne signifie pas que ne Bpeut accéder qu'aux protectedet publicmembres A.

N'oubliez pas qu'une fois Bdevenu ami de A, il peut accéder à n'importe quel membre de A, quelle que soit la section dans laquelle vous écrivez friend class B.

Nawaz
la source
3
donc je suppose que quiconque m'a dit ça ne savait tout simplement pas de quoi ils parlaient. Merci :)
BIU
-2

La déclaration d'ami apparaît dans un corps de classe et accorde à une fonction ou à une autre classe l'accès aux membres privés et protégés de la classe où la déclaration d'ami apparaît.

En tant que tels, les spécificateurs d'accès n'ont aucun effet sur la signification des déclarations d'amis (ils peuvent apparaître dans des sections privées: ou publiques: sans aucune différence).

goyuiitv
la source
Répondre à une question vieille de sept ans sans être nouveau. Merci de ne pas créer de doublons.
MAChitgarha