与printf()
函数不同,它没有编译器猜测no的格式说明符。论点。那么在cout的情况下会发生什么?
答案 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);
(根据a
,b
和c
的类型,将调用a free function或a 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;
注意:这仅针对已定义的运算符IStream& operator >> (IStream&, Type)
和OStream& operator << (OStream&, Type)
进行编译。定义的运算符可以是标准库或用户定义的运算符提供的运算符。
答案 3 :(得分:1)
编译器不需要猜测来自printf
的格式说明符的参数数量(尽管有些是为了更好的警告)。在cout
的情况下,每个<<
都是输出内容或操纵流的命令,因此不需要格式说明符。