Freigeben über


Klassenmember-Funktionen und Klassen als Friends

Klassenmember Funktionen können als Freunde in anderen Klassen deklariert werden.Betrachten Sie das folgende Beispiel:

// 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

Im vorherigen Beispiel werden nur die Funktion A::Func1( B& ) Friend-Zugriff wird auf die Klasse Bgewährt.Daher ist der Zugriff auf den privaten Member _b in Func1der Klasse Ajedoch nicht in Func2richtig.

Eine friend-Klasse ist eine Klasse alle, deren Memberfunktionen Friend-Funktionen sind. h. einer Klasse, deren Memberfunktionen Zugriff auf die anderen privaten und geschützten Member der Klasse haben.Angenommen, die friend Deklaration in der Klasse B worden war:

friend class A;

In diesem Fall würden alle Memberfunktionen in der Klasse A Friend-Zugriff auf die Klasse Berteilt worden sein.Der folgende Code ist ein Beispiel für eine friend-Klasse:

// 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();
}

Freundschaft ist nicht miteinander, sofern sie nicht explizit als solcher angegeben.Im obigen Beispiel können Memberfunktionen von YourClass die privaten Member von YourOtherClassnicht verweisen.

Ein verwalteter Typ kann keine friend-Klassen oder Friend-Funktionen, friend-Schnittstellen haben.

Die Freundschaft wird nicht geerbt. Dies bedeutet, dass die Klassen, die von YourOtherClass abgeleitet sind, die privaten Member der entity_YourClasss nicht zugreifen können.Freundschaft ist dies nicht die Freunde transitiv Klassen aus YourOtherClass können die privaten Member der entity_YourClasss nicht zugegriffen werden.

Die folgende Abbildung zeigt vier Klassendeklarationen an: Base, Derived, aFriendund anotherFriend.Nur Klasse verfügt aFriend direkten Zugriff auf private Member von Base (und allen Membern geerbt Base werden).

Auswirkungen von friend-Beziehung

Grafik zu Auswirkungen von Friend-Beziehungen

Siehe auch

Referenz

friend (C++)