La definición de la clase le da la pista, mirando la clase se
puede saber qué funciones tienen permiso para modificar su parte
privada. Si una función es friend, significa
que no es miembro, pero que de todos modos se le quiere dar
permiso para modificar la parte privada, y debe estar
especificado en la definición de la clase para que todo el mundo
pueda ver que esa es una de las funciones privilegiadas.
C++ es un lenguaje orientado a objetos híbrido, no es puro, y
friend fue añadido para solucionar algunos problemas
que se presentaban en la práctica. Es bueno apuntar que esto
hace al lenguaje menos «puro», pues C++ fue
diseñado para ser pragmático, no para aspirar a un ideal
abstracto.