Introducción a la función de amigo en C ++

Una característica única del programa C ++ es que utiliza la encapsulación para mantener los datos envueltos junto con todas sus funciones operativas para constituir una entidad individual. Esto garantiza que solo se pueda acceder a los datos particulares por las tareas que operan en él y no por cualquier otra tarea fuera de esta clase. Por lo tanto, en los casos en que la clase externa pueda necesitar acceder a estos datos en particular, usamos esta función específica llamada función "amiga". Sabemos que al usar palabras clave como "protegido" y "privado" no podemos acceder a esos datos fuera de su método. Pero por el bien de la aplicación en tiempo real, hay muchos casos en los que podemos necesitar los mismos datos privados / protegidos y usar el ya declarado siempre es más preferible que crearlo muchas veces. Veamos cómo declarar y usar una función de amigo en C ++ en este artículo.

Una función de amigo al declarar está precedida por la palabra clave "amigo" como se muestra aquí:

Sintaxis :

class (
private
protected
friend (arguments list);
)
returnDatatype functionName(arguments list)(
//function from which protected and private keywords
//can be accessed from as this is a friend method of className
)
class (
private
protected
friend (arguments list);
)
returnDatatype functionName(arguments list)(
//function from which protected and private keywords
//can be accessed from as this is a friend method of className
)

Como se muestra en el código anterior, la función amiga debe declararse en la misma clase donde se ha declarado la palabra clave protegida o privada para que esos datos sean accesibles fuera de la clase. Esta función se puede declarar en cualquier parte del programa completo como un método normal de C ++. La definición de la función no requiere palabras clave como amigos o ningún operador de resolución de alcance.

Ejemplos de función de amigo en el programa C ++

Veamos un poco mejor el funcionamiento de la función de amigo tomando algunos ejemplos a continuación.

Ejemplo 1

Código:

/* C++ program which exhibits the working of friend function.*/
#include
using namespace std;
class Weight
(
private:
int kilo;
public:
Weight(): kilo(0) ( )
//Declaration of a friend function
friend int addWeight(Weight);
);
// Defining a friend function
int addWeight(Weight w)
(
//accessing private data from non-member function
w.kilo += 17;
return w.kilo;
)
int main()
(
Weight W;
cout<<"Weight: "<< addWeight(W);
return 0;
)

Salida:

Aquí la función amigo es el método addWeight () que se declara dentro de la clase Weight. Kilo es la palabra clave privada declarada dentro del método Weight, a la que luego se accede desde la función addWeight. Este ejemplo fue solo para mostrar el uso básico de una función de amigo, aunque no hay un uso en tiempo real aquí. Ahora profundicemos en algunos ejemplos significativos.

Ejemplo # 2

Código:

#include
using namespace std;
// Forward declaration
class SecondClass;
class FirstClass (
private:
int first_num;
public:
FirstClass(): first_num(12) ( )
// Declaring a friend function
friend int divide(FirstClass, SecondClass);
);
class SecondClass (
private:
int sec_num;
public:
SecondClass(): sec_num(4) ( )
// Another friend declaration
friend int divide(FirstClass, SecondClass);
);
// Function divide() is the friend function of classes FirstClass and SecondClass
// that accesses the member variables first_num and sec_num
int divide(FirstClass fnum, SecondClass snum)
(
return (fnum.first_num / snum.sec_num);
)
int main()
(
FirstClass fnum;
SecondClass snum;
cout<<"The value got by dividing first by second number: "<< divide(fnum, snum);
return 0;
)

Salida:

En este ejemplo, ambas clases FirstClass y SecondClass tienen divide () declarado como una función amiga. Por lo tanto, esta función puede acceder a los datos de variables privadas tanto de la clase. Aquí la función divide () se usa para agregar variables privadas first_num y sec_num de dos objetos fnum y snum y devuelve su valor al método principal.

Para que esto funcione correctamente, se debe hacer una declaración directa para SecondClass como se muestra en el código porque se hace referencia a SecondClass dentro de FirstClass usando el programa:

friend int divide(FirstClass, SecondClass);

Clase de amigo: hay una clase de amigo al igual que la función de amigo. La clase amigo también puede acceder a las variables privadas y protegidas de la clase, ya que es un amigo.

Sintaxis :

class One(
friend class Two;
);
class Two(
);
class One(
friend class Two;
);
class Two(
);
class One(
friend class Two;
);
class Two(
);

Como se muestra arriba, la clase dos es amiga de la clase uno. Por lo tanto, la clase dos puede acceder a las variables privadas y protegidas de la clase uno. Pero la clase uno no puede acceder a variables protegidas o privadas de la clase dos porque esto no es una amistad mutua. Para la amistad mutua, debemos declararla explícitamente. De la misma manera, esta amistad de la clase no se hereda, lo que significa que la clase Dos no será amiga de las subclases de la clase Uno, aunque sea amiga de la clase Uno.

Ejemplo # 3

Código:

#include
#include
using namespace std;
class Perimeter(
int len, brd, perimeter, temp;
public:
Perimeter(int len, int brd):len(len), brd(brd)
()
void calcPerimeter()(
temp = len + brd;
perimeter = 2 * temp;
)
friend class printClass;
);
class printClass(
public:
void printPerimeter(Perimeter a)(
cout<<"Perimeter = "< )
);
int main()(
Perimeter a(10, 15);
a.calcPerimeter();
printClass p;
p.printPerimeter(a);
return 0;
)
#include
#include
using namespace std;
class Perimeter(
int len, brd, perimeter, temp;
public:
Perimeter(int len, int brd):len(len), brd(brd)
()
void calcPerimeter()(
temp = len + brd;
perimeter = 2 * temp;
)
friend class printClass;
);
class printClass(
public:
void printPerimeter(Perimeter a)(
cout<<"Perimeter = "< )
);
int main()(
Perimeter a(10, 15);
a.calcPerimeter();
printClass p;
p.printPerimeter(a);
return 0;
)

Salida:

En este código, tenemos 2 clases: clase de perímetro que encuentra el perímetro utilizando los valores de longitud y amplitud. Las variables len, brd, perímetro y temperatura son todas variables privadas del perímetro de la clase. Por lo tanto, debemos hacer que printClass sea un amigo de la clase Perimeter. Esta clase de impresión utiliza el valor del perímetro calculado en la función calcPerimeter () en la clase Perimeter. Como todos son miembros privados, tenemos que hacer que printPerimeter sea un amigo de la clase Perimeter. Una vez hecho esto, tenemos que crear un objeto en la clase principal para calcular el perímetro y pasar este objeto a la clase printPerimeter para mostrar el perímetro.

Características de la función Friend en C ++

  • El método y la clase a la que se ha declarado como amigo no necesitan ser los mismos.
  • Como no está dentro del alcance de la clase respectiva, no se puede invocar usando su objeto.
  • También se puede llamar como un método normal, incluso sin el uso del objeto.
  • Solo puede acceder directamente a los nombres de los miembros utilizando su nombre de objeto y el operador de membresía de puntos junto con su nombre de miembro.
  • No hay restricción, ya que se permite declararla en la parte privada o pública.

Conclusión

Teniendo en cuenta todas las características mencionadas anteriormente y los ejemplos de la función de amigo en C ++, uno también debe tener cuidado al usar las funciones de un amigo con numerosas funciones y clases externas, ya que puede disminuir la importancia de la encapsulación de diferentes clases en la programación orientada a objetos. Por lo tanto, puede ser tanto una bendición como una maldición para el programador.

Artículo recomendado

Esta es una guía para la función Friend en C ++. Aquí discutimos la función Introducción a Friend en C ++ y sus Ejemplos junto con la Implementación y Salida de Código. También puede consultar nuestros artículos sugeridos para obtener más información.

  1. Función recursiva en C ++ (ejemplos)
  2. Las 11 características principales de C ++
  3. Biblioteca de aprendizaje automático de C ++
  4. Función hash en C con tipos
  5. Función hash en PHP con sintaxis