Funções de membro de classe e Classes como amigos
Funções de membro de 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& ) é concedido acesso friend à classe B.Portanto, acesso ao membro privado _b está correta no Func1 da classe A , mas não está em Func2.
A friend classe é uma classe que todas as funções cujas membros são funções de amigo de uma classe, ou seja, cujas funções de membro têm acesso a membros da outra classe de particulares e protegidos.Suponha que o friend declaração na classe B tivesse sido:
friend class A;
Nesse caso, todas as funções de membro na classe A seria receberam acesso friend à classe 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();
}
Amizade não é comum, a menos que explicitamente especificadas como tal.No exemplo acima, as funções de membro de YourClass não pode acessar membros particulares da YourOtherClass.
Um tipo gerenciado não pode ter quaisquer funções de amigo, amigo, interfaces ou classes amigo.
Amizade não é herdada, o que significa que as classes derivadas de YourOtherClass não é possível acessar YourClassde membros particulares.Amizade não é transitiva, as classes que são amigos das YourOtherClass não é possível acessar YourClassde membros particulares.
A figura a seguir mostra quatro declarações de classe: Base, Derived, aFriend, e anotherFriend.Somente a classe aFriend tem acesso direto aos membros particulares da Base (e para todos os membros Base pode ter herdado).
Implicações da relação de amigo