对象 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);
(根据 a
、b
和 c
的类型,将调用 a free function or a member function。)
并且每个单独的调用都是针对接受您提供的类型的重载。不需要参数计数或格式字符串,因为它们与您对 printf
.
的 单次 调用一样
与 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);
(根据 a
、b
和 c
的类型,将调用 a free function or a member function。)
并且每个单独的调用都是针对接受您提供的类型的重载。不需要参数计数或格式字符串,因为它们与您对 printf
.