c ++运算符<<(char)但是在hexa / int中

时间:2016-05-05 15:54:53

标签: c++ operator-overloading ostream

为什么三个运算符<<输出不同的方式?

#include <iostream>
#include <string>

using namespace std;

int main()
{
  operator<<(cout, "Hello").operator<<('w').operator<<(endl); // Hello119

  cout << (void *)'w' << endl; // 0x77

  cout << 'w'; // w

  operator<<(operator<<(cout, "Hello"), 'w').operator<<(endl); // Hellow !!!
}

第一个运算符&lt;&lt;使用2个参数按预期为字符串输出正确的输出,而其他参数则为...

有人可以向我解释一下吗?

更多信息:

cout << "Hello" << 'w' << endl;将被解释为......

operator<<(operator<<(cout, "Hello"), 'w').operator<<(endl); // Hellow

1 个答案:

答案 0 :(得分:5)

您正在强制转换为void指针,并且std::ostream& operator<<(std::ostream&,void*);有专门化,因此您将输出作为十六进制值而不是十进制。

注意:0x77 == 119

另请注意:

您在此处调用std::ostream::operator<<()成员运算符重载:

   operator<<(cout, "Hello").operator<<('w').operator<<(endl);
// ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
// |                         |
// |                         + Calls the std::ostream::operator<<() member operator
// + Calls the std::ostream& operator(std::ostream, T) global overload

char没有重载,因此会隐式转换为int,数字值119会出现在输出中。

从上面std::ostream::operator<<()成员函数的链接引用:

enter image description here 正如你在评论中提到的那样

std::cout << 'w' << 'w' << 'w' << std::endl;    

将被推断为全局std::ostream& operator<<(std:: ostream&, T)重载的链式调用:

operator<<(operator<<(operator<<(operator<<(std::cout,'w'),'w'),'w'),std::endl);