logo

Clase de amigo y función en C++

A clase de amigos Puede acceder a miembros privados y protegidos de otras clases en las que esté declarado como amigo. A veces resulta útil permitir que una clase particular acceda a miembros privados y protegidos de otras clases. Por ejemplo, a una clase LinkedList se le puede permitir acceder a miembros privados de Node.

Podemos declarar una clase amiga en C++ usando el amigo palabra clave.



Sintaxis:

friend class class_name; // declared in the base class>

clase de amigos


Ejemplo:



patrones de programación java
C++
// C++ Program to demonstrate the // functioning of a friend class #include  using namespace std; class GFG { private:  int private_variable; protected:  int protected_variable; public:  GFG()  {  private_variable = 10;  protected_variable = 99;  }  // friend class declaration  friend class F; }; // Here, class F is declared as a // friend inside class GFG. Therefore, // F is a friend of class GFG. Class F // can access the private members of // class GFG. class F { public:  void display(GFG& t)  {  cout << 'The value of Private Variable = '  << t.private_variable << endl;  cout << 'The value of Protected Variable = '  << t.protected_variable;  } }; // Driver code int main() {  GFG g;  F fri;  fri.display(g);  return 0; }>

Producción
The value of Private Variable = 10 The value of Protected Variable = 99>

Nota: Podemos declarar una clase amiga o una función en cualquier parte del cuerpo de la clase base, ya sea en un bloque privado, protegido o público. Funciona de todos modos.

Función de amigo

Al igual que una clase amiga, a una función amiga se le puede otorgar acceso especial a miembros privados y protegidos de una clase en C++. No son funciones miembro de la clase, pero pueden acceder y manipular a los miembros privados y protegidos de esa clase porque están declarados como amigos.

Una función amiga puede ser:



  1. Una función global
  2. Una función miembro de otra clase.
Función amiga en C++ con ejemplo

Función amiga en C++

Sintaxis:

friend return_type function_name (arguments); // for a global function  or friend return_type class_name::function_name (arguments); // for a member function of another class>
sintaxis de la función amiga

Sintaxis de la función amiga

1. Función global como función amiga

Podemos declarar cualquier función global como función amiga. El siguiente ejemplo demuestra cómo declarar una función global como función amiga en C++:

Ejemplo:

C++
// C++ program to create a global function as a friend // function of some class #include  using namespace std; class base { private:  int private_variable; protected:  int protected_variable; public:  base()  {  private_variable = 10;  protected_variable = 99;  }    // friend function declaration  friend void friendFunction(base& obj); }; // friend function definition void friendFunction(base& obj) {  cout << 'Private Variable: ' << obj.private_variable  << endl;  cout << 'Protected Variable: ' << obj.protected_variable; } // driver code int main() {  base object1;  friendFunction(object1);  return 0; }>

Producción
Private Variable: 10 Protected Variable: 99>

En el ejemplo anterior, hemos utilizado una función global como función amiga. En el siguiente ejemplo, usaremos una función miembro de otra clase como función amiga.

2. Función de miembro de otra clase como función de amigo

También podemos declarar una función miembro de otra clase como función amiga en C++. El siguiente ejemplo demuestra cómo utilizar una función miembro de otra clase como función amiga en C++:

Ejemplo:

C++
// C++ program to create a member function of another class // as a friend function #include  using namespace std; class base; // forward definition needed // another class in which function is declared class anotherClass { public:  void memberFunction(base& obj); }; // base class for which friend is declared class base { private:  int private_variable; protected:  int protected_variable; public:  base()  {  private_variable = 10;  protected_variable = 99;  }  // friend function declaration  friend void anotherClass::memberFunction(base&); }; // friend function definition void anotherClass::memberFunction(base& obj) {  cout << 'Private Variable: ' << obj.private_variable  << endl;  cout << 'Protected Variable: ' << obj.protected_variable; } // driver code int main() {  base object1;  anotherClass object2;  object2.memberFunction(object1);  return 0; }>

Producción
Private Variable: 10 Protected Variable: 99>

Nota : El orden en el que definimos la función amiga de otra clase es importante y se debe cuidar. Siempre tenemos que definir ambas clases antes de la definición de la función. Es por eso que hemos utilizado una definición de función miembro fuera de la clase.

Características de las funciones de amigo

  • Una función amiga es una función especial en C++ que a pesar de no ser función miembro de una clase tiene el privilegio de acceso el datos privados y protegidos de una clase.
  • Una función amiga es una función no miembro o una función ordinaria de una clase, que se declara como amiga usando la palabra clave amigo dentro de la clase. Al declarar una función como amiga, se otorgan todos los permisos de acceso a la función.
  • La palabra clave amigo se coloca solo en la declaración de función de la función amiga y no en el definición o llamada de función.
  • Una función amiga se llama como una función ordinaria. No se puede llamar usando el nombre del objeto y el operador de punto. Sin embargo, puede aceptar el objeto como argumento a cuyo valor desea acceder.
  • Una función amiga se puede declarar en cualquier sección de la clase, es decir, pública, privada o protegida.

A continuación se muestran algunos ejemplos más de funciones amigas en diferentes escenarios:

nueva línea pitón

Una función amigable para múltiples clases

C++
// C++ Program to demonstrate  // how friend functions work as // a bridge between the classes #include  using namespace std; // Forward declaration class ABC;  class XYZ {  int x; public:  void set_data(int a)   {   x = a;   }  friend void max(XYZ, ABC); }; class ABC {  int y; public:  void set_data(int a)   {   y = a;   }  friend void max(XYZ, ABC); }; void max(XYZ t1, ABC t2) {  if (t1.x>t2.y)  cout<< t1.x;  else  cout << t2.y; } // Driver code int main() {  ABC _abc;  XYZ _xyz;  _xyz.set_data(20);  _abc.set_data(35);  // calling friend function  max(_xyz, _abc);   return 0; }>

Producción
35>

La función amigo nos proporciona una forma de acceder a datos privados pero también tiene sus desventajas. A continuación se muestra la lista de ventajas y desventajas de las funciones amigas en C++:

Ventajas de las funciones de amigo

  • Una función amiga puede acceder a miembros sin necesidad de heredar la clase.
  • La función de amigo actúa como un puente entre dos clases al acceder a sus datos privados.
  • Se puede utilizar para aumentar la versatilidad de operadores sobrecargados.
  • Puede declararse en la parte pública, privada o protegida de la clase.

Desventajas de las funciones de amigo

  • Las funciones amigas tienen acceso a miembros privados de una clase desde fuera de la clase, lo que viola la ley de ocultación de datos.
  • Las funciones amigas no pueden realizar ningún polimorfismo en tiempo de ejecución en sus miembros.

Puntos importantes sobre las funciones y clases de amigos

  1. Los amigos deben usarse sólo para propósitos limitados. Demasiadas funciones o clases externas declaradas como amigas de una clase con acceso a datos privados o protegidos reducen el valor de la encapsulación de clases separadas en la programación orientada a objetos.
  2. Amistad es no mutuo . Si la clase A es amiga de B, entonces B no se convierte automáticamente en amiga de A.
  3. La amistad no se hereda. (Ver este para más detalles)
  4. El concepto de amigos no está en Java.