Außer bei virtuellen Funktionen, die immer Elementfunktionen sein müssen, ist die Entscheidung oft nicht leicht.
Im Zweifelsfall: Benutze OO-Stil
Elementfunktionen.
Aber:
class bruch
{ int zaehler;
int nenner;
public:
bruch (int z = 0, int n = 1);
int zae() { return zaehler;}
int nen() { return nenner;}
bruch operator* (const bruch& b);
};
...
bruch viertel(1,4);
bruch achtel(1,8);
bruch result = viertel * achtel; // OK
result = result * 5; // OK
result = 2 * achtel; // FEHLER !
Der linke (implizite) Operand muß vom Typ bruch sein.
Also: Nicht-Element-Funktion:
bruch operator* ( const bruch& b1,
const bruch& b2)
{ return bruch(b1.zae() * b2.zae(),
b1.nen() * b2.nen());
}
So funktioniert auch result = 2 * achtel.
Sollte operator* Freund der Klasse sein?
In unserem Fall: nein, da Zugriffsfunktionen (inline) auf die nicht-öffentlichen Datenelemente existieren.
Aber häufig ist es nötig:
class string
{ ...
ostream& operator<<(ostream& o);
};
...
string s;
s << cout;
Das ist legal, entspricht aber nicht den Konventionen!
Globale Freund-Funktion.