Última actualización:2026-10-12
friend en C++: funciones y clases amigas¶
Sobre el autor:¶
Cuenta pública personal de WeChat:

0. Resumen¶
La amistad (friend) ofrece un mecanismo por el que una función ordinaria o una función miembro de una clase accede a los miembros privados o protegidos de otra clase. Es decir, hay dos formas de friend:
(1) Función amiga: una función ordinaria accede a los miembros privados o protegidos de una clase.
(2) Clase amiga: las funciones miembro de la clase A acceden a los miembros privados o protegidos de la clase B.
Ventaja: mejora la eficiencia de ejecución del programa.
Inconveniente: rompe la encapsulación de la clase y la transparencia de los datos.
Resumen: - Puede acceder a los miembros privados - Rompe la encapsulación - La relación de amistad no es transitiva - La relación de amistad es unidireccional - La forma y la cantidad de declaraciones de amistad no están restringidas
1. Funciones amigas¶
Se declara en cualquier zona de la declaración de la clase, y su definición va fuera de la clase.
Ten en cuenta que una función amiga es simplemente una función ordinaria, no es una función miembro de esa clase; puede llamarse desde cualquier lugar, y dentro de la función amiga se accede a los miembros privados o protegidos de la clase mediante el nombre del objeto.Para el código concreto, consulta: friend_func.cpp
#include <iostream>
using namespace std;
class A
{
public:
A(int _a):a(_a){};
friend int geta(A &ca); ///< 友元函数
private:
int a;
};
int geta(A &ca)
{
return ca.a;
}
int main()
{
A a(3);
cout<<geta(a)<<endl;
return 0;
}
2. Clases amigas¶
La declaración de la clase amiga va dentro de la declaración de la clase, y su implementación fuera de ella.
Si la clase B es amiga de la clase A, entonces la clase B puede acceder directamente a los miembros privados de A.Para el código concreto, consulta: friend_class.cpp
#include <iostream>
using namespace std;
class A
{
public:
A(int _a):a(_a){};
friend class B;
private:
int a;
};
class B
{
public:
int getb(A ca) {
return ca.a;
};
};
int main()
{
A a(3);
B b;
cout<<b.getb(a)<<endl;
return 0;
}
3. A tener en cuenta¶
-
La relación de amistad no se hereda Si la clase B es amiga de la clase A y la clase C hereda de la clase A, la clase amiga B no puede acceder directamente a los miembros privados o protegidos de la clase C.
-
La relación de amistad no es transitiva Si la clase B es amiga de la clase A y la clase C es amiga de la clase B, la clase amiga C no puede acceder directamente a los miembros privados o protegidos de la clase A; es decir, no existe la relación de “amigo de mi amigo”.
Temas relacionados¶
- Funciones virtuales puras y clases abstractas en C++ | C++那些事
- Aserciones assert en C++ | C++那些事
- Campos de bits en C++ | C++那些事
- Implementar el polimorfismo de C++ en lenguaje C | C++那些事
- const en C++: constantes y modificación | C++那些事
- La familia completa de const en C++ | C++那些事
- El operador de desreferencia * en C++ | C++那些事
- Inicialización y asignación en C++ | C++那些事
- Formas de devolver varios valores en C++ | C++那些事
- La palabra clave mutable en C++ | C++那些事