Ir para o conteúdo

Última atualização:2026-10-12

Friend (amigo) em C++

Sobre o autor:

Conta oficial do WeChat:

wechat

0.Visão geral

Friend (amigo) oferece um mecanismo pelo qual uma função comum ou uma função membro de uma classe acessa os membros privados ou protegidos de outra classe. Ou seja, há duas formas de friend:

(1) Função amiga (friend function): uma função comum acessa membros privados ou protegidos de uma determinada classe.

(2) Classe amiga (friend class): funções membro da classe A acessam membros privados ou protegidos da classe B.

Vantagem: melhora a eficiência de execução do programa.

Desvantagem: rompe o encapsulamento da classe e a transparência dos dados.

Resumo: - Permite acessar membros privados - Rompe o encapsulamento - A relação de amizade não é transitiva - A relação de amizade é unidirecional - A forma e a quantidade de declarações de friend não são restritas

1.Função amiga (friend function)

Declarada em qualquer região da declaração da classe, mas definida fora da classe.

friend <类型><友元函数名>(<参数表>);

Note que a função amiga é apenas uma função comum, não é uma função membro da classe; ela pode ser chamada de qualquer lugar e, dentro dela, os membros privados ou protegidos da classe são acessados por meio do nome do objeto.

O código concreto está em: 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.Classe amiga (friend class)

A declaração da classe amiga fica na declaração da classe, e a implementação fica fora dela.

friend class <友元类名>;

Se a classe B é amiga da classe A, então a classe B pode acessar diretamente os membros privados de A.

O código concreto está em: 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.Atenção

  • A relação de amizade não é herdável Suponha que a classe B seja amiga da classe A e que a classe C herde da classe A: a classe amiga B não consegue acessar diretamente os membros privados ou protegidos da classe C.

  • A relação de amizade não é transitiva Suponha que a classe B seja amiga da classe A e que a classe C seja amiga da classe B: a classe amiga C não consegue acessar diretamente os membros privados ou protegidos da classe A; ou seja, não existe uma relação de "amigo do amigo".

Tópicos relacionados

Comentários