diferente a printf()
no tiene especificador de formato desde donde el compilador adivina el no. de argumentos. Entonces, ¿qué sucede en caso de cout?
Respuestas
3 para la respuesta № 1IOStreams solo toma uno argumento a la vez, por lo que funciona bien. :)
La magia de la sobrecarga del operador significa que esto:
std::cout << a << b << c;
es en realidad esto:
std::operator<<(std::operator<<(std::operator<<(std::cout, a), b), c);
o esto:
std::cout.operator<<(a).operator<<(b).operator<<(c);
(Dependiendo de los tipos de a
, b
y c
, ya sea una función libre o una función miembro será invocado)
y cada llamada individual es a una sobrecarga que acepta el tipo que le das. No se requieren recuento de argumentos ni cadenas de formato, ya que están con su soltero llama a printf
.
2 para la respuesta № 2
<<
y >>
El operador está sobrecargado para diferentes tipos de datos. No es necesario un especificador de formato en este caso. por <<
operador siguientes definiciones están en ostream
clase:
ostream& operator<< (bool val);
ostream& operator<< (short val);
ostream& operator<< (unsigned short val);
ostream& operator<< (int val);
ostream& operator<< (unsigned int val);
ostream& operator<< (long val);
ostream& operator<< (unsigned long val);
ostream& operator<< (float val);
ostream& operator<< (double val);
ostream& operator<< (long double val);
ostream& operator<< (void* val);
ostream& operator<< (streambuf* sb );
ostream& operator<< (ostream& (*pf)(ostream&));
ostream& operator<< (ios& (*pf)(ios&));
ostream& operator<< (ios_base& (*pf)(ios_base&));
2 para la respuesta № 3
Las transmisiones de C ++ no tienen implementación paraentrada / salida de múltiples valores. Tienen los operadores de entrada / salida formateados >> / <<, que separan cada valor de salida. Además de estos, tienen funciones sin formato que operan en un solo valor (matriz)
Ejemplo: un solo ostream& operator << (T a);
pone un valor "a" en la secuencia y devuelve una referencia a la secuencia en sí. Esa referencia a la transmisión es elegible para aceptar el siguiente valor "b" como en stream << a << b;
Nota: Esto compila para operadores definidos IStream& operator >> (IStream&, Type)
y OStream& operator << (OStream&, Type)
, solamente. Un operador definido puede ser un operador proporcionado por la biblioteca estándar o un operador definido por el usuario.
1 para la respuesta № 4
El compilador no necesita adivinar el número de argumentos de printf
"s especificador de formato (aunque algunos lo hacen para mejores advertencias). En caso de cout
cada uno <<
es un comando para generar algo o manipular la secuencia, por lo que no es necesario un especificador de formato.