Olá Ramon! Como vai?
A palavra-chave friend
em C++ é usada para dar a uma função ou classe externa acesso aos membros privados de outra classe. Isso é útil quando você quer que uma função externa, que não faz parte da classe, tenha a capacidade de acessar os dados privados dessa classe.
Função Amiga
Imagine que você tem uma classe Conta
e dentro dela, você tem dados que são privados, como o titular da conta. Normalmente, esses dados não podem ser acessados diretamente de fora da classe. No entanto, se você declarar uma função como amiga dessa classe, essa função poderá acessar esses dados privados.
Por exemplo, se você tem uma função que precisa acessar o nome do titular para exibi-lo, mas essa função não faz parte da classe Conta
, você pode declará-la como uma função amiga:
class Conta {
private:
Pessoa titular;
public:
friend std::ostream& operator<<(std::ostream& cout, const Conta& conta);
};
Aqui, operator<<
é uma função amiga da classe Conta
, o que significa que ela pode acessar o titular da conta, mesmo que ele seja privado.
Classe Amiga
De forma semelhante, você pode ter uma classe inteira como amiga de outra classe. Isso permite que todos os métodos da classe amiga acessem os membros privados da outra classe. No entanto, isso é menos comum e deve ser usado com cuidado, pois pode tornar o código menos seguro e mais difícil de manter.
Exemplo Prático
Vamos supor que você tenha uma classe Pessoa
e uma classe Conta
, e você quer que uma função externa possa exibir o nome do titular da conta. Você pode fazer isso usando uma função amiga:
#include <iostream>
#include <string>
class Pessoa {
private:
std::string nome;
public:
Pessoa(std::string n) : nome(n) {}
std::string recuperaNome() const { return nome; }
};
class Conta {
private:
Pessoa titular;
public:
Conta(Pessoa p) : titular(p) {}
friend std::ostream& operator<<(std::ostream& cout, const Conta& conta);
};
std::ostream& operator<<(std::ostream& cout, const Conta& conta) {
cout << "O titular da conta é: " << conta.titular.recuperaNome();
return cout;
}
int main() {
Pessoa p("Vinícius");
Conta c(p);
std::cout << c << std::endl;
return 0;
}
Neste exemplo, a função operator<<
é capaz de acessar o nome do titular da conta, mesmo que titular
seja um membro privado da classe Conta
.
Espero ter ajudado e bons estudos!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.