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?
friend
classe d'accéder aux membres déclarésprivate
dans 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 ARéponses:
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.
la source
friend
détail d'implémentation ou une partie de l'interface?class Friend
peuvent accéder à tous les membres privés de la classe actuelle.operator==(T, T)
utilisant des données privées membres deT
, et que vous l'utilisezfriend
comme détail d'implémentation afin que celaoperator==
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)Comme la syntaxe
friend class B
ne déclare pas un membre de la classeA
, peu importe où vous l'écrivez, la classeB
est un ami de la classeA
.En outre, si vous écrivez
friend class B
enprotected
sectionA
, il ne signifie pas que neB
peut accéder qu'auxprotected
etpublic
membresA
.N'oubliez pas qu'une fois
B
devenu ami deA
, il peut accéder à n'importe quel membre deA
, quelle que soit la section dans laquelle vous écrivezfriend class B
.la source
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).
la source