Programmiersprache C/C++

friend

  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.
Da die Deklaration als friend innerhalb der jeweiligen Klasse stattfindet, erscheint das Schlüsselwort selbst nicht in der Definition der Funktion.


Zurück zum Menü
Zurück zur vorigen Seite Weiter zur nächsten Seite

P. Böhme, 02.01.1996