programar - ejemplos de programas en c++ pdf
¿Por qué los iostreams de C++ siempre son asignados por la izquierda? (4)
Así es como se supone que deben trabajar. Creo que esto se hizo para diferenciar claramente las operaciones de entrada (>>) de las operaciones de salida (<<).
Si sobrecarga al operador <<
de esta manera elegante (como sugirió el capitán Obvious en los comentarios):
template<typename T>
std::istream& operator<<( T& data , std::istream& is )
{
is >> data;
return *this;
}
Será menos claro si la operación fue de entrada o salida (con std::cin std::cout
es fácil, pero hay dos flujos llamados file1
y file2
, uno para leer y otro para escribir):
a << std::cin;
std::cout << a;
a << file;
file << a;
Estoy aprendiendo C ++ y nunca he tratado con secuencias. Hubiera esperado que la notación fuera:
std::cout << "foo";
char foo << std::cin;
Estoy seguro de que hay una buena razón para que sea std::cin >> foo
. ¿Qué es?
Es así que te verás obligado a poner la consola a la izquierda de la manera que Dios quiere. :)
En realidad, tiene que ver con algo llamado sobrecarga del operador. Si solo estás aprendiendo C ++, probablemente todavía no lo hayas cubierto, así que escribe lo que voy a decir en "cosas que obtendré más adelante".
C ++ vive encima de C. En C <<
y >>
son solo operadores de desplazamiento de bits. En c ++ puede ser más. std:cout << foo
NO es C, es C ++. La razón por la que es C ++ es porque el objeto std::cout
sobrecarga al operador <<
para que signifique algo distinto al desplazamiento de bits.
En otras palabras, <<
solo significa enviar foo
a cout
, porque cout
dijo que eso es lo que significa. <<
es, en efecto, una función en la clase cout
.
Es casi como si std::cout->sendThatToMe(foo)
.
En todo este asunto, foo
es solo un parámetro desafortunado para el viaje que no tiene nada que decir sobre lo que <<
significa. Es por eso que no puedes hacerlo de la otra manera. Si lo hicieras sería como si estuvieras diciendo esto:
foo->sendMeToThat( std::cout).
Se puede hacer que funcione si agrega esa función (bueno, el operador >>
realmente) a cada objeto apestoso que quiera enviar a la consola. Oh y buena suerte quitándolo con primitivos.
Entonces, si bien creo que hay muchas razones de estilo para querer mantener las cosas de la consola a la izquierda, en realidad hay una razón técnica para que sea así. Es porque los operadores que están sobrecargados ya se han dejado asociativos. Lo han estado desde que se utilizaron para cambiar bits en los viejos días C Sobrecargarlos no ofrece una oportunidad para cambiar su asociatividad.
Tiene que ver con la asociatividad de los operadores << y >>.
Originalmente, eran solo para cambiar de lugar donde se dejaron asociativos. La asociación del operador sigue siendo la misma cuando está sobrecargada (de lo contrario, el código sería imposible de analizar):
Si lo hiciste
int a, b ;
a << b << cin
obtendrías
(a << b) << cin
Un poco de cambio y entrada.
Por eso la biblioteca estándar lo hace de la manera que lo hace.
a << b
y a >> b
son solo taquigrafías para:
operator<<(a,b)
y
operator>>(a,b)
(o los equivalentes de función miembro).
Es decir, son solo llamadas a funciones particulares. Da la casualidad de que la biblioteca estándar de C ++ sobrecarga al operator<<
para realizar la transmisión de salida a ostream
s, y al operator>>
para realizar la transmisión de entrada desde istream
s.
Estas funciones solo están sobrecargadas para tener el flujo a la izquierda.
Hay dos razones para esta decisión. La primera es la simplicidad de la notación (es decir, dado que solo hay una forma de ordenar los operandos, hay menos ambigüedad sobre el significado de cualquier código en particular y hay menos necesidad de implementar grandes cantidades de sobrecargas diferentes al extender la biblioteca estándar a apoyar una clase adicional). El segundo es que <<
y >>
quedan asociativos, y así:
int a, b;
a << b << cin;
se convertiría:
(a << b) << cin;
mientras:
int a, b;
cin >> b >> a;
correctamente se convierte en:
(cin >> b) >> a;