Saltar a contenido

Última actualización:2026-10-12

friend en C++: funciones y clases amigas

Sobre el autor:

Cuenta pública personal de WeChat:

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.

friend <类型><友元函数名>(<参数表>);
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.

friend class <友元类名>;
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

Comentarios