Friends von Klassen

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

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