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