friend Klassenname; friend Funktionsdeklarator;Dieses Schlüsselwort teilt dem Compiler mit, daß eine Funktion oder Klasse Zugriff auf die als private oder protected deklarierten Elemente der eigenen Klasse hat.
Friend-Klassen
Eine Klasse, bei der sämtliche Methoden Zugriff auf die Elemente einer anderen Klasse haben, wird als Friend-Klasse bezeichnet.
Friend-Klassen müssen innerhalb der Klasse als solche deklariert werden, die Zugriff auf ihre Elemente gewährt - beispielsweise:
class YourClass
{
friend class YourOtherClass; // YourOtherClass als friend deklariert
private:
int topSecret;
};
class YourOtherClass
{
public:
void change( YourClass yc );
};
void YourOtherClass::change( YourClass yc )
{
yc.topSecret++; // Zugriff ist erlaubt
}
Eine derartige "Freundschaft" beruht nur dann auf Gegenseitigkeit,
wenn beide Klassen die jeweils andere als friend deklarieren:
Im zuvor verwendeten Beispiel hat YourOtherClass zwar Zugriff auf die
Elemente von YourClass, aber nicht umgekehrt. Die Eigenschaft friend wird weder vererbt noch ist sie transitiv: Eine von YourOtherClass abgeleitete Klasse hat also nur über die Methoden von YourOtherClass Zugriff auf Elemente von YourClass; wenn YourOtherClass eine dritte Klasse YourThirdClass als friend deklariert, haben die Methoden von YourThirdClass keine zusätzlichen Zugriffsmöglichkeiten auf Elemente von YourClass.
Friend-Funktionen
Eine Routine, die nicht Element einer Klasse ist, aber dennoch Zugriff auf die als private und protected deklarierten Elemente dieser Klasse hat, wird als Friend-Funktion bezeichnet.
Friend-Funktionen müssen innerhalb der Klasse als solche deklariert werden, die Zugriff auf ihre Elemente gewährt - beispielsweise:
class Complex
{
public:
Complex( float re, float im );
friend Complex operator+( Complex first, Complex second );
private:
float real, imag;
};
Zugriffs-Spezifizierer (public, private und protected) spielen in diesem
Zusammenhang keine Rolle: Die Deklaration einer Routine als friend kann
also an beliebigen Punkten innerhalb einer Klassendefinition erscheinen. Zu beachten ist, daß Friend-Funktionen keine Methoden sind. Sie bekommen keinen Zeiger auf das jeweilige Objekt übergeben und werden wie normale Funktionen deklariert - also ohne vorangestellten Klassennamen.
Beispiel:
Complex operator+( Complex first, Complex second )
{
return Complex( first.real + second.real,
first.imag + second.imag );
}
Die in diesem Beispiel definierte Friend-Funktion operator+ muß die
beteiligten Objekte also über vollständige Adressen (first.real anstelle
von real) ansprechen. Wie zu sehen, hat sie aber Zugriff auf die Felder
real und imag, die von der Klasse Complex als private deklariert sind.