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

时间:2015-06-08 19:14:05

标签: c++ variadic-functions

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

4 个答案:

答案 0 :(得分:3)

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 functiona member function。)

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

答案 1 :(得分:2)

对于不同的数据类型,

<<>>运算符会重载。在这种情况下不需要格式说明符。对于<<运算符,以下定义位于ostream类:

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 :(得分:2)

C ++流没有用于输入/输出多个值的实现。它们具有格式化的输入/输出运算符&gt;&gt; /&lt;&lt;&lt ;,,,,,,,,,,,,,,,,,,,,,,,除此之外,它们还具有在单个值(数组)上运行的无格式函数

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

中的下一个值'b'

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

答案 3 :(得分:1)

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