Freigeben über


Klassenmemberfunktionen und Klassen als Friends

Klassenmemberfunktionen können in anderen Klassen als "Friends" 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 wird nur der Funktion A::Func1( B& ) Friend-Zugriff auf die B-Klasse gewährt. Daher ist der Zugriff auf den privaten Member _b in Func1 der Klasse A richtig, jedoch nicht in Func2.

Bei der friend-Klasse handelt es sich um eine Klasse, deren sämtliche Memberfunktionen Friend-Funktionen einer Klasse sind, d. h. deren Memberfunktionen Zugriff auf die privaten und geschützten Member der anderen Klasse haben. Angenommen, die friend-Deklaration in der B-Klasse lautete:

friend class A;

In diesem Fall wären allen Memberfunktionen in der A-Klasse Friend-Zugriff auf die B-Klasse gewährt worden. 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();
}

Die Friendship-Klasse wurde nicht gegenseitig festgelegt, es sei denn, sie wurde explizit als solche angegeben. Im obigen Beispiel können Memberfunktionen von YourClass nicht auf die privaten Member von YourOtherClass zugreifen.

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

Die Friendship-Klasse wird nicht vererbt. Dies bedeutet, dass die von YourOtherClass abgeleiteten Klassen nicht auf die privaten Member von YourClass zugreifen können. Die Friendship-Klasse ist nicht transitiv. Daher können Klassen, die Friends von YourOtherClass sind, nicht auf die privaten Member von YourClass zugreifen.

Die folgende Abbildung zeigt vier Klassendeklarationen: Base, Derived, aFriend und anotherFriend. Nur die aFriend-Klasse hat direkten Zugriff auf die privaten Member der Base-Klassendeklaration (und auf alle Member, die Base möglicherweise geerbt hat).

Auswirkungen von Friend-Beziehungen

Auswirkungen von Friend-Beziehungen

Siehe auch

Referenz

Friend (C++)