Declaración de amigo en C ++: diferencia entre público y privado

142

¿Hay alguna diferencia entre declarar una función / clase de amigo como privada o pública? Parece que no puedo encontrar nada sobre esto en línea.

Me refiero a la diferencia entre:

class A
{
 public: 
      friend class B;
 };

y

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

¿Hay una diferencia?

BIU
fuente
28
Tal información errónea ... alguien no merecía ser un amigo. Depende completamente de usted si le gustan sus amigos escondidos con sus partes privadas.
Tony Delroy
¿
Puedo
3
@I Phantasm: es una declaración que permite que una instancia de la friendclase acceda a los miembros declarados privateen la clase que hizo la declaración. En el caso de este ejemplo, una instancia de clase B puede acceder a los miembros privados de clase A
BIU
2
Esta pregunta me ha ganado demasiados puntos en este sitio. De acuerdo entonces.
BIU

Respuestas:

139

No, no hay diferencia: solo dices que la clase B es amiga de la clase A y ahora puede acceder a sus miembros privados y protegidos, eso es todo.

diente filoso
fuente
55
así que supongo que quien me dijo eso simplemente no sabía de qué estaban hablando. Gracias :)
BIU
pero para fines de documentación, ¿consideraría un frienddetalle de implementación o parte de la interfaz?
TemplateRex
1
@TemplateRex: IMO que es parte de la interfaz: es una afirmación bastante fuerte que hay algunos (aleatorios) class Friendque pueden acceder a todos los miembros privados de la clase actual.
Sharptooth
para clase aleatoria, sí. Pero supongamos que implementa operator==(T, T)usando miembros de datos privados de T, y usa friendcomo un detalle de implementación para que operator==pueda aparecer como no miembro. En mi opinión, esta amistad no debería aparecer en la interfaz pública (como será generada por Doxygen, por ejemplo)
TemplateRex
Leí hace algún tiempo aquí en stackoverflow que algunos compiladores, supongo que algunos viejos con errores, se confundirán si se produce una declaración de amigo dentro de una región no pública.
Peregring-lk
35

Dado que la sintaxis friend class Bno declara un miembro de la clase A, por lo que no importa dónde la escriba, class Bes un amigo de la clase A.

Además, si escribe friend class Ben la protectedsección de A, entonces NO significa que Bsolo puede acceder protectedy publicmiembros de A.

Siempre recuerde que una vez que se Bhace amigo de A, puede acceder a cualquier miembro A, sin importar en qué sección escriba friend class B.

Nawaz
fuente
3
así que supongo que quien me dijo eso simplemente no sabía de qué estaban hablando. Gracias :)
BIU
-1

La declaración de amigo aparece en un cuerpo de clase y otorga una función u otra clase de acceso a miembros privados y protegidos de la clase donde aparece la declaración de amigo.

Como tales, los especificadores de acceso no tienen efecto sobre el significado de las declaraciones de amigos (pueden aparecer en secciones privadas o públicas: sin diferencia).

goyuiitv
fuente
Responder una pregunta de siete años sin ser nuevo. Por favor, evite hacer las cosas más duplicadas.
MAChitgarha