Funzioni e classi del membro della classe come amici
Le funzioni membro delle classi possono essere dichiarate come friend in altre classi.Si consideri l'esempio seguente:
// 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
Nell'esempio precedente, solo la funzione A::Func1( B& ) viene concesso l'accesso friend su classi B.Di conseguenza, l'accesso al membro privato _b è corretto in Func1di classe Ama non in Func2.
In friend la classe è una classe in cui tutte le funzioni membro siano le funzioni di una classe, ovvero, in cui le funzioni membro friend hanno accesso agli altri membri privati e protetti della classe.Si supponga friend dichiarazione della classe B era stato:
friend class A;
In tal caso, tutte le funzioni membro nella classe A sarebbe stato concesso l'accesso friend su classi B.Il codice seguente è un esempio di una classe friend:
// 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();
}
L'accesso friend non è reciproca a meno che non venga specificata in modo esplicito come tali.Nell'esempio precedente, le funzioni membro di YourClass non è possibile accedere ai membri privati di l YourOtherClass.
Un tipo gestito non può avere funzioni friend, classi friend, o interfacce friend.
L'accesso friend non sono ereditate, pertanto classi derivate da YourOtherClass non può accedere a YourClass“membri privati di.L'accesso friend non è transitiva, pertanto classi di e friend YourOtherClass non può accedere a YourClass“membri privati di.
Nella figura seguente vengono illustrati quattro dichiarazioni di classe: Base, Derived, aFriende anotherFriend.Solo classe aFriend ha accesso diretto ai membri privati di l Base (e ai membri Base può ereditare).
Implicazioni della relazione friend