174 votes

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

Y a-t-il une différence entre déclarer une fonction/classe amie comme privée ou publique ? Je n'arrive pas à trouver quelque chose à 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 ?

33 votes

Une telle désinformation... quelqu'un ne méritait pas d'être un ami. C'est entièrement à vous de décider si vous aimez que vos amis se mêlent de vos affaires privées.

0 votes

Puis-je demander ce qu'est une classe d'amis ?

6 votes

@I Phantasm - il s'agit d'une déclaration qui permet à une instance de l'objet de l'analyse de l'environnement d'être utilisée. friend pour accéder aux membres déclarés private 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 A

169voto

sharptooth Points 93379

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

5 votes

Donc je suppose que celui qui m'a dit ça ne savait pas de quoi il parlait. Merci :)

1 votes

Mais à des fins de documentation, considéreriez-vous un friend un détail d'implémentation ou une partie de l'interface ?

1 votes

@TemplateRex : IMO c'est une partie de l'interface - c'est une revendication assez forte qu'il y a une certaine (aléatoire) class Friend qui peut accéder à tous les membres privés de la classe courante.

43voto

Nawaz Points 148870

Puisque la syntaxe friend class B ne déclare pas un membre de la classe A donc peu importe où vous l'écrivez, la classe B est un ami de la classe A .

De même, si vous écrivez friend class B en protected section de A alors cela ne signifie PAS que B ne peut accéder qu'à protected y public les membres de A .

Rappelez-vous toujours qu'une fois B devient un ami de A il peut accéder cualquier membre de A peu importe dans quelle section vous écrivez friend class B .

4 votes

Donc je suppose que celui qui m'a dit ça ne savait pas de quoi il parlait. Merci :)

2voto

Alfred Fuller Points 514

Le c++ a la notion d'"amis cachés" : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1601r0.pdf

Ce qui ne s'applique qu'aux fonctions amies qui sont définies en ligne. Cela fait en sorte que les fonctions ne peuvent être trouvées que par le biais de recherches dépendantes des arguments, les supprimant de l'espace de nom environnant.

-4voto

goyuiitv Points 5

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

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 différence).

2 votes

Répondre à une question vieille de sept ans sans être nouvelle. S'il vous plaît, évitez de rendre les choses plus dupliquées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X