Autre raison dans votre exemple: il doit s'agir d'un friend
car c'est la seule façon de définir une fonction libre dans la définition de classe. Si vous vouliez une fonction sans ami, il faudrait la définir en dehors de la classe.
Pourquoi préféreriez-vous définir dans la classe? Parfois, il est agréable de définir tous les opérateurs ainsi:
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
};
pourrait être un peu plus convivial que:
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;
}
Cela suppose bien sûr que vous définissez les fonctions membres liées à la définition de classe , plutôt que de les déclarer là et de les définir dans un fichier .cpp.
Editer: J'ai utilisé + = et + comme exemple sans vraiment y penser, mais votre question concerne environ operator<<
, qui n'a pas d'opérateurs étroitement liés comme operator+
. Mais si operator<<
appelle une ou plusieurs fonctions membres liées à l'impression, vous pouvez vouloir le définir près de l'endroit où elles sont définies.
Avez-vous vraiment besoin d'autres raisons? –
@mmyers: J'essaie juste de comprendre aussi clairement que je peux .... – skydoor
Il ne peut évidemment pas être une fonction de membre (voir la réponse de Charles Bailey), mais il ne doit pas être un * ami * - si vous pouvez l'implémenter en termes d'interface publique de la classe, ce serait super. – UncleBens