2010-07-23 24 views
6

¿Por qué la sobrecarga de operadores de flujo (< <, >>) debe mantenerse como amigos en lugar de hacerlos miembros de la clase?Sobrecarga del operador de flujo

+3

Hace que la programación sea mucho más emocionante cuando las funciones tienen una aventura con los miembros privados de sus clases. – zneak

Respuesta

9

Cuando sobrecarga un operador binario como una función miembro de una clase, la sobrecarga se utiliza cuando el primer operando es del tipo de clase.

Para los operadores de flujo, el primer operando es la secuencia y no (normalmente) la clase personalizada.

Por esta razón, los operadores de flujo sobrecargados para las clases personalizadas que están diseñados para ser utilizados de la manera convencional no pueden ser funciones miembro de la clase personalizada, deben ser funciones libres.

(supongo que las clases de flujo no están abiertas para ser modificadas; si lo fueran, podría agregar funciones miembro para transmitir clases para adaptarse a tipos personalizados adicionales, pero esto normalmente sería indeseable desde el punto de vista de la dependencia).)

Si son amigos o no deberían depender de si necesitan acceso a miembros no públicos de la clase.

+0

Creo que esto es un poco engañoso. * Pueden * ser funciones miembro, pero para usarlas de la forma habitual (escritura en secuencias), deben ser funciones miembro. –

+0

@sztomi: No entiendo tu comentario. No, no necesitan _necesitar_ ser funciones miembro; no pueden ser funciones de miembro (a menos que esté escribiendo una clase de secuencia o escribiendo a los operadores de transmisión hacia atrás desde el resto del mundo). –

+0

Así que sí, pueden ser funciones miembro. Si desea que funcionen como de costumbre (como el resto de la palabra lo usa), debe definirlos como amigos. A eso me refería. –

0

Miembros de la clase? ¿Cuál es el tipo de operando de la izquierda?

No es necesario que sean friend, a menos que sea necesario acceder a datos privados que de otro modo serían inaccesibles.

2

Así que usted puede decir:

some_stream << my_class; 

Tenga en cuenta que la definición de operadores miembros hace que el lado izquierdo de la clase que uno mismo. e.g .:

my_class << some_stream; 

Cuál no es la manera en que se supone que funcionan las secuencias estándar.