Funciones de amigo de C ++

Una función amiga de una clase se define fuera del alcance de esa clase, pero tiene derecho a acceder a todos los miembros privados y protegidos de la clase. Aunque los prototipos de funciones de amigos aparecen en la definición de clase, los amigos no son funciones miembro.

Un amigo puede ser una función, plantilla de función o función miembro, o una clase o plantilla de clase, en cuyo caso toda la clase y todos sus miembros son amigos.

Para declarar una función como amiga de una clase, preceda el prototipo de función en la definición de clase con la palabra clave friend como sigue -

class Box {
   double width;
   
   public:
      double length;
      friend void printWidth( Box box );
      void setWidth( double wid );
};

Para declarar todas las funciones miembro de la clase ClassTwo como amigas de la clase ClassOne, coloque la siguiente declaración en la definición de la clase ClassOne:

friend class ClassTwo;

Considere el siguiente programa:

#include <iostream>
 
using namespace std;
 
class Box {
   double width;
   
   public:
      friend void printWidth( Box box );
      void setWidth( double wid );
};

// Member function definition
void Box::setWidth( double wid ) {
   width = wid;
}

// Note: printWidth() is not a member function of any class.
void printWidth( Box box ) {
   /* Because printWidth() is a friend of Box, it can
   directly access any member of this class */
   cout << "Width of box : " << box.width <<endl;
}
 
// Main function for the program
int main() {
   Box box;
 
   // set box width without member function
   box.setWidth(10.0);
   
   // Use friend function to print the wdith.
   printWidth( box );
 
   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Width of box : 10