La característica amiga, ya sea utilizada por función o clase, puede producir un impacto negativo en el marco orientado a objetos, ya que debilita la encapsulación que está en contra del paradigma orientado a objetos. Esta es la razón por la que la función de amigo se debe usar con prudencia, de lo contrario podría interrumpir la ocultación de datos del código.
Esta característica de amigo no es conmutativa ni transitiva . X es amigo de Y no deduce que Y también sea amigo de X. Si X es amigo de Y e Y es amigo de Z, no implica que X sea amigo de Z.
Gráfica comparativa
Bases para la comparación | Función de amigo | Clase de amigo |
---|---|---|
BASIC | Es una función utilizada con una palabra clave de amigo para otorgar acceso a una función que no sea miembro a los miembros privados de una clase. | Es una clase utilizada con una palabra clave de amigo para acceder a los miembros privados de otra clase. |
Declaración hacia adelante | Debe ser usado. | No es obligatorio. |
Utilizar | Se puede utilizar una función de amigo en alguna situación de sobrecarga del operador. | Se puede utilizar una clase de amigo cuando se crea una clase en la parte superior de otra clase. |
Definición de la función de amigo
La función de amigo se usa para acceder a los miembros privados y protegidos de una clase permitiendo que la función que no es miembro tenga acceso. En este tipo de función, una palabra clave de amigo se usa antes del nombre de la función en el momento de la declaración. Hay algunas condiciones restrictivas aplicadas a la función de amigo. La primera condición es que la función amiga no sea heredada por una clase secundaria. La segunda condición es que el especificador de la clase de almacenamiento puede no estar presente en la función amiga, lo que significa que no se puede declarar como estático y externo.
La función de amigo no se llama con un objeto de invocación de la clase. Los ejemplos de la función de amigo son: una función global, función miembro de una clase, la plantilla de función puede ser una función de amigo. Vamos a entenderlo con la ayuda de un ejemplo.
#include usando namespace std; clase primero {int data; public: first (int i): data (i) {} friend void display (const first & a); }; visualización de vacío (primero y a const) {cout << "data =" <Definición de clase de amigo
De manera similar a la función de amigo, podemos hacer que una clase sea un amigo de otra clase que se conoce como clase de amigo . Para que la clase amiga pueda acceder a miembros privados definidos dentro de la otra clase. Es importante recordar que la clase amiga solo puede acceder a los nombres definidos dentro de la otra clase en lugar de heredar otra clase. Precisamente, los miembros de la primera clase no pueden convertirse en miembros de la clase de amigos. Estas clases de amigos rara vez se utilizan.
La clase de amigos se puede declarar en más de una clase. Se considera como un método alternativo corto para la función de amigo porque con la ayuda de esto podemos crear una clase de amigo que puede acceder a todos los miembros de datos y la función en lugar de crear múltiples funciones de amigo.
#include usando namespace std; clase Primero {// Declara a un amigo clase amigo clase Segundo; public: First (): a (0) {} void print () {cout << "El resultado es" << a << endl; } privado: int a; }; class Second {public: void change (First & yclass, int x) {yclass.a = x; }}; int main () // Salida El resultado es 0 El resultado es 5Diferencias clave entre la función de amigo y la clase de amigo
- La función de amigo es una función que puede acceder a los miembros privados y protegidos de una clase. En contraste, una clase de amigos es una clase que ayuda a acceder a los miembros privados de una clase.
- Se declara una función de amigo al incluir su prototipo dentro de la clase, anularlo con la palabra clave amigo. Del mismo modo, una clase de amigo también se define mediante la palabra clave amigo.
- La declaración de reenvío se usa en caso de que la función de amigo esté en contra, no es necesario usarla en la clase de amigo.
Conclusión
Se requiere una función de amigo cuando una función necesita acceder a dos o más clases independientes, miembros internos. Por otro lado, se necesita una clase de amigos cuando una clase requiere acceder a los miembros de otra clase. Cuando una función miembro múltiple debe ser un amigo de esa función, en ese caso, es mejor usar la clase de amigo.