对象 cout 如何打印多个参数?

How object cout prints multiple arguments?

printf() 函数不同,它没有编译器猜测编号的格式说明符。的论据。那么在 cout 的情况下会发生什么?

<<>> 运算符针对不同的数据类型重载。在这种情况下不需要格式说明符。对于 << 运算符,以下定义在 ostream class 中:

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&));

编译器不需要从 printf 的格式说明符中猜测参数的数量(尽管有些这样做是为了更好的警告)。在 cout 的情况下,每个 << 都是一个输出内容或操作流的命令,因此不需要格式说明符。

C++ 流没有 inputting/outputting 多个值的实现。它们具有格式化的 input/output 运算符 >>/<<,用于分隔每个输出值。除此之外,它们还有对单个值(数组)进行操作的未格式化函数

示例:单个 ostream& operator << (T a); 将值 'a' 放入流中,并 returns 对流本身的引用。对流的引用有资格接受下一个值 'b',如 stream << a << b;

注意:这仅针对定义的运算符 IStream& operator >> (IStream&, Type)OStream& operator << (OStream&, Type) 进行编译。定义的算子可以是标准库提供的算子,也可以是用户自定义的算子。

IOStreams 一次只接受 一个 参数,所以它工作得很好。 :)

运算符重载的魔力在于:

std::cout << a << b << c;

实际上是这样的:

std::operator<<(std::operator<<(std::operator<<(std::cout, a), b), c);

或者这个:

std::cout.operator<<(a).operator<<(b).operator<<(c);

(根据 abc 的类型,将调用 a free function or a member function。)

并且每个单独的调用都是针对接受您提供的类型的重载。不需要参数计数或格式字符串,因为它们与您对 printf.

单次 调用一样