Otro motivo en su ejemplo - tiene que ser un friend
porque esa es la única forma de definir una función libre dentro de la definición de la clase. Si quería una función libre de no amigos, debería definirse fuera de la clase.
¿Por qué prefiere definirlo en la clase? A veces es bueno para definir todos los operadores entre sí:
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
};
podría ser un poco más fácil de usar 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;
}
Esto supone, por supuesto, que está definiendo las funciones miembro relacionadas en la definición de clase , en lugar de declararlos allí y definirlos en un archivo .cpp.
Editar: He usado + = y + como ejemplo sin pensar realmente en ello, pero su pregunta es acerca de operator<<
, que no tiene operadores estrechamente relacionados como operator+
. Pero si operator<<
llama a una o más funciones miembro relacionadas con la impresión, es posible que desee definirlo cerca de donde están definidas.
¿Realmente necesita alguna otra razón? –
@mmyers: Intento entenderlo tan claro como puedo ... – skydoor
Obviamente no puede ser una función miembro (ver la respuesta de Charles Bailey), pero no tiene que ser un * amigo * - si puedes implementarlo en términos de la interfaz pública de la clase, eso sería genial. – UncleBens