Ein weiterer Grund in Ihrem Beispiel - es muss eine friend
sein, denn das ist die einzige Möglichkeit, eine freie Funktion innerhalb der Klassendefinition zu definieren. Wenn Sie eine nicht-freundefreie Funktion wünschen, müsste sie außerhalb der Klasse definiert werden.
Warum würden Sie es am liebsten in der Klasse definieren? Manchmal ist es schön, alle Betreiber zu definieren zusammen:
struct SomeClass {
// blah blah blah
SomeClass &operator+=(const SomeClass &rhs) {
// do something
}
friend SomeClass operator+(SomeClass lhs, const SomeClass &rhs) {
lhs += rhs;
return lhs;
}
// blah blah blah
// several pages later
};
könnte ein bisschen mehr benutzerfreundlicher als:
struct SomeClass {
// blah blah blah
SomeClass &operator+=(const SomeClass &rhs) {
// do something
}
// blah blah blah
// several pages later
};
SomeClass operator+(SomeClass lhs, const SomeClass &rhs) {
lhs += rhs;
return lhs;
}
Dies setzt voraus, natürlich, dass Sie die entsprechenden Member-Funktionen in der Klassendefinition definieren Stattdessen deklarieren sie sie und definieren sie in einer CPP-Datei.
Bearbeiten: Ich habe + = und + als Beispiel ohne wirklich darüber nachzudenken, aber Ihre Frage ist über operator<<
, die keine eng verwandten Operatoren wie operator+
hat. Wenn jedoch operator<<
eine oder mehrere Mitgliedsfunktionen zum Drucken aufruft, möchten Sie diese möglicherweise in der Nähe ihrer Definition definieren.
Brauchen Sie wirklich noch andere Gründe? –
@mmyers: Ich versuche nur, es so klar zu verstehen, wie ich kann. – skydoor
Es kann offensichtlich keine Funktion eines Mitglieds sein (siehe Charles Bailey's Antwort), aber es muss kein * Freund * sein - wenn Sie können es in Bezug auf die öffentliche Schnittstelle der Klasse implementieren, das wäre super. – UncleBens