Todos sabemos que membros privados de uma classe só podem ser acessados por funções de membro da classe e não podem ser acessados fora da classe. Isso reflete as idéias de encapsulamento e ocultação do design de classes em C++, que é a vantagem mais básica do C++.
Mas se ocasionalmente quisermos realmente acessar esses membros privados fora da classe, isso se tornará muito mais problemático e estaremos no dilema de não podermos acessá-los nem declará-los como tipos públicos.
O surgimento de amigos pode resolver muito bem este problema, ou seja, ao declarar a função externa como tipo de amigo e dar-lhe o direito de acesso a membros privados dentro da classe, pode alcançar o melhor dos dois mundos. Este é o significado da amizade. Também pode ser visto no significado literal. Assim como “amigos”, abre um canal verde.
Um objeto amigo pode ser uma função geral global ou uma função membro em outra classe. Isso é chamado de função amiga . Além disso, um amigo também pode ser uma turma, que é chamada de turma de amigos .
Depois de compreender o significado e a função dos amigos, vamos ver como usá-los em C++. Para funções amigas, você só precisa declarar a função dentro da classe e adicionar a palavra-chave amigo antes dela. Esta função tem permissões exclusivas e se torna uma função amiga.
A última coisa a notar é que os amigos não pertencem à classe em si, sejam eles funções de amigos ou classes de amigos. Nem pode usar o ponteiro this dentro da classe, nem pode ser herdado, assim como os amigos do pai não são necessariamente amigos do filho.
A seguir, escrevemos um programa para encontrar a distância entre dois pontos:
#include<iostream>#include<math.h>usingnamespacestd;classPoint{private:doublex;doubley;public:Point(doublea,doubleb){x=a;y=b;}intGetPoint(){cout<<(<< x<<,<<y<<;return0;}frienddoubleDistance(Point&a,Point&b);};//Encontre a distância entre dois pontos doubleDistance(Point&a,Point&b){doublexx;doubleyy;xx=ax-bx;yy = ay-by;returnsqrt(xx*xx+yy*yy);}intmain(){PontoA(2.0,3.0);PontoB(1.0,2.0);doubledis;dis=Distância(A,B);cout<<dis < <endl;return0;}
Você pode observar que a função que implementa a distância entre dois pontos é uma função geral externa. Como precisamos acessar membros privados na classe, nós a declaramos como um tipo de amigo frito na classe, veja a última linha da classe Point. . Neste momento, o código é compilado sem problemas e a saída normal é:
Você pode ver os resultados do teste. Você pode experimentar sozinho no computador. Tente não declará-lo como um tipo de amigo e observe os resultados do erro.