¿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?

friendclase acceda a los miembros declaradosprivateen 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
frienddetalle de implementación o parte de la interfaz?class Friendque pueden acceder a todos los miembros privados de la clase actual.operator==(T, T)usando miembros de datos privados deT, y usafriendcomo 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 Bno declara un miembro de la claseA, por lo que no importa dónde la escriba, classBes un amigo de la claseA.Además, si escribe
friend class Ben laprotectedsección deA, entonces NO significa queBsolo puede accederprotectedypublicmiembros deA.Siempre recuerde que una vez que se
Bhace 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