Quelqu'un m'a dit qu'il y a une différence entre déclarer une classe d'amis dans les espaces publics ou privés de la classe, mais je n'arrive pas à trouver quoi que ce soit en ligne et je ne suis pas sûr qu'ils sachent de quoi ils parlaient.
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?
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 maintenant accéder à ses membres privés et protégés, c'est tout.
Puisque la syntaxe friend class B
ne déclare pas un membre de la classe A
, le lieu d'écriture n'a donc pas d'importance, la classe B
est un ami de la classe A
.
De même, si vous écrivez friend class B
dans la section protected
de A
, cela ne signifie PAS que B
ne peut accéder qu'aux membres protected
et public
de A
.
Rappelez-vous toujours qu'une fois que B
devient un 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
.
La déclaration d'amis 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'amis 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 les sections private: ou public:, sans aucune différence).