¿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?
friend
clase acceda a los miembros declaradosprivate
en 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 ARespuestas:
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.
fuente
friend
detalle de implementación o parte de la interfaz?class Friend
que pueden acceder a todos los miembros privados de la clase actual.operator==(T, T)
usando miembros de datos privados deT
, y usafriend
como un detalle de implementación para queoperator==
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)Dado que la sintaxis
friend class B
no declara un miembro de la claseA
, por lo que no importa dónde la escriba, classB
es un amigo de la claseA
.Además, si escribe
friend class B
en laprotected
sección deA
, entonces NO significa queB
solo puede accederprotected
ypublic
miembros deA
.Siempre recuerde que una vez que se
B
hace amigo deA
, puede acceder a cualquier miembroA
, sin importar en qué sección escribafriend class B
.fuente
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).
fuente