Schlüsselwort friend



  • Hallo,

    ich hab ein kleines Verständnisproblem mit dem Schlüsselwort friend.

    ich hab folgende Dekleration in meiner Klasse:

    friend ostream& operator<<(ostream &ostr, const String &s);
    

    Wieso mach man das? Man kann doch das friends auch einfach weg lassen und es dann als als normale Methode der Klasse ausprogrammieren.

    Oder macht man das um ausserhalb der Klasse einen Zugriff auf die Attribute der KLasse zu erlangen. Die mit fiend markierte Methode hat ja vollen Zugriff auf alles Attribute.

    Über eine Antwort würde ich mich sehr freuen!



  • x-rey schrieb:

    Wieso mach man das? Man kann doch das friends auch einfach weg lassen und es dann als als normale Methode der Klasse ausprogrammieren.

    Kann man nicht. Zumindest nicht den operator<<. Bei Operatoren, die Klassenmethoden sind, ist der linke Operand immer ein Objekt der Klasse. Siehe auch hier:

    http://magazin.c-plusplus.net/artikel/�berladung von Operatoren in CPlusPlus (Teil 1)



  • Wie Pumuckl schon sagte, das kommt ganz auf den zu überladenden Operator an. Manche macht man als Klassenmember, manche eben als freie Funktion. Da bei einer Memberfunktion, also auch bei einem überladenen Operator innerhalb der Klasse, der linke Operand immer vom Typ der Klasse ist, ist es für denn Operator<< sehr unvorteilhaft. Denn beim Operator << ist der Rückgabetyp immer eine Referenz auf ein ostream-Objekt, damit eine Verkettung wie

    cout << "Hallo" << "Welt" << endl;
    

    möglich ist.

    Wenn der linke Operand also nicht vom Typ der Klasse sein darf, musst du ihn als freie Funktion deklarieren und wenn er vom Typ der Klasse sein soll, macht man ihn normalerweise als Member der Klasse.

    Und wenn die Funktion frei ist, ist ja klar dass du sie als friend deklarieren musst, damit du von außerhalb auf die privaten Elemente zugreifen darfst.

    Lg freeG



  • fr33g schrieb:

    und wenn er vom Typ der Klasse sein soll, macht man ihn normalerweise als Member der Klasse.

    Macht man normalerweise auch nicht, wenn es z.B. Klassen gibt, deren Objekte implizit in ein Objekt der fraglichen Klasse konvertiert werden können. Sonst könnten nämlich die linken Operanden nicht konvertiert werden (weil sie ja vom Typ der Klasse sein müssen) die rechten aber schon.

    Beispiel:

    class MyInt
    {
      int i;
    public: 
      MyInt(int i): i(i) {}
      bool operator< (MyInt const& other)
      {
        return i < other.i;
      }
    };
    
    int main()
    {
      MyInt a(5);
      MyInt b(10);
      bool b1 = a < b; //OK
      bool b2 = a < 6; //OK, aequivalent zu a < MyInt(6);
      bool b3 = 2 < b; //FEHLER
    }
    

    [/cpp]

    Steht auch in meinem oben verlinkten Magazinartikel 😉


Log in to reply