Friends von Klassen
Nach oben zu Klassen - Index
Ein friend F der Klasse X ist eine Funktion oder Klasse, die - obwohl kein Element der Klasse X - volle Zugriffsrechte auf die private- und protected-Elemente von X hat. In bezug auf Gültigkeitsbereich, Deklaration und Definition wird F wie eine normale Funktion behandelt.
Da F kein Element von X ist, liegt es nicht im Gültigkeitsbereich von X und kann deshalb nicht mit den Auswahloperatoren x.F bzw. xptr->F aufgerufen werden (wobei x ein Objekt von X und xptr ein Zeiger auf ein Objekt von X ist).
Um eine Funktion zum friend einer Klasse zu machen, deklariert oder definiert man sie in dieser Klasse mit dem Spezifizierer friend.
friend-Funktionen, die innerhalb einer Klasse definiert sind, gehorchen denselben Inline-Regeln wie Elementfunktionen (siehe Inline-Funktionen). friend-Funktionen werden weder durch ihre Stellung innerhalb einer Klasse noch durch irgendwelche Zugriff-Spezifizierer beeinflusst. Ein Beispiel:
class X { int i; // private zu X friend void friend_func(X*, int); /* friend_func ist nicht private, obwohl sie im private-Abschnitt deklariert wird */ public: void member_func(int); }; /* Definitionen; beide Funktionen greifen auf private int i zu */ void friend_func(X* xptr, int a) { xptr–>i = a; } void X::member_func(int a) { i = a; } X xobj; /* Man beachte den Unterschied in den Funktionsaufrufen */ friend_func(&xobj, 6); xobj.member_func(6);
Alle Funktionen der Klasse Y können mit einer einzigen Deklaration zu Friends der Klasse X gemacht werden:
class Y; // unvollständige Deklaration class X { friend Y; int i; void member_funcX(); }; class Y; { // Deklaration vervollständigen void friend_X1(X&); void friend_X2(X*); . . . };
Die in Y deklarierten Funktionen sind Friends von X, obwohl sie keinen friend-Spezifizierer haben. Sie haben Zugriff auf die private-Elemente von X wie beispielsweise i oder member_funcX.
Es ist außerdem möglich, dass eine einzelne Elementfunktion der Klasse X ein Friend der Klasse Y wird:
class X { . . . void member_funcX(); } class Y { int i; friend void X::member_funcX(); . . . };
“Klassenfreundschaften” sind beschränkt: X-friend von Y und Y-friend von Z bedeutet nicht, dass X ein friend von Z ist. „Freundschaften“ sind nicht vererbbar.
Siehe auch
- C++-Klassen
- Klassentypen
- Gültigkeitsbereich Klasse
- Klassenobjekte
- Klassen-Member-Liste
- Member-Funktionen
- Das Schlüsselwort this
- Statische Elemente
- Inline-Funktionen
- Gültigkeitsbereich von Elementen
- Verschachtelte Typen
- Element-Zugriffskontrolle
- Zugriff auf Basisklassen und abgeleitete Klassen
- Virtuelle Basisklassen
- Friends von Klassen