Funções de membro da classe e classes como amigos
As funções de membro da classe podem ser declaradas como amigos em outras classes. Considere o exemplo a seguir:
// classes_as_friends1.cpp
// compile with: /c
class B;
class A {
public:
int Func1( B& b );
private:
int Func2( B& b );
};
class B {
private:
int _b;
// A::Func1 is a friend function to class B
// so A::Func1 has access to all members of B
friend int A::Func1( B& );
};
int A::Func1( B& b ) { return b._b; } // OK
int A::Func2( B& b ) { return b._b; } // C2248
No exemplo anterior, somente a função A::Func1( B& ) tem acesso de amigo para classificar B. Em virtude disso, o acesso ao membro particular _b está correto em Func1 da classe A mas não em Func2.
Uma classe friend é uma classe cujas funções membro são as funções amigas de uma classe, ou seja, cujas funções membro tenham acesso aos outros membros particulares e protegidos da classe. Suponha que a declaração friend na classe B fosse:
friend class A;
Nesse caso, todas as funções membro na classe A receberão acesso de amigo para classificar B. O código a seguir é um exemplo de uma classe de amigo:
// classes_as_friends2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
class YourClass {
friend class YourOtherClass; // Declare a friend class
public:
YourClass() : topSecret(0){}
void printMember() { cout << topSecret << endl; }
private:
int topSecret;
};
class YourOtherClass {
public:
void change( YourClass& yc, int x ){yc.topSecret = x;}
};
int main() {
YourClass yc1;
YourOtherClass yoc1;
yc1.printMember();
yoc1.change( yc1, 5 );
yc1.printMember();
}
A amizade não é mútua a menos que explicitamente especificada como tal. No exemplo anterior, as funções membro de YourClass não podem acessar os membros privados de YourOtherClass.
Um tipo gerenciado não pode ter nenhuma função de amigo, classes de amigo ou interfaces de amigo.
A amizade não é herdada, o que significa que as classes derivadas de YourOtherClass não podem acessar os membros privados de YourClass. A amizade não é transitiva, assim as classes que são amigos de YourOtherClass não podem acessar membros privados de YourClass.
A figura a seguir mostra quatro declarações de classe: Base, Derived, aFriend e anotherFriend. Somente a classe aFriend tem acesso direto aos membros privados de Base (e a todos os membros que Base pode ter herdado).
Implicações da relação de amigo