/ / ¿Cómo cout objeto imprime múltiples argumentos? - c ++, funciones variadas

¿Cómo objeto cout imprime múltiples argumentos? - c ++, funciones variadas

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 № 1

IOStreams 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 coutcada uno << es un comando para generar algo o manipular la secuencia, por lo que no es necesario un especificador de formato.