Condividi tramite


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

Rappresentazione grafica delle implicazioni della relazione Friend

Vedere anche

Riferimenti

friend (C++)