为什么插入运算符是打印地址而不是字符串?

时间:2014-12-16 11:11:39

标签: c++ visual-c++ operator-overloading std

我有简单的代码行,我使用插入运算符<<来显示hello world字符串。如果我使用 一个运算符b 那么它应该导致a.operator(b);我尝试使用插入运算符做同样的事情并且在输出中我得到了字符串的地址,而不是实际字串。

std::cout<<"Hello world"<<std::endl;
std::cout.operator<<("Hello world").operator<<(std::endl);

输出:

  

你好世界
  0120CC74

我正在使用Visual Studio。

我的操作员转换有问题吗?

3 个答案:

答案 0 :(得分:18)

std::cout<<"Hello world"<<std::endl;

使用const char*的重载输出运算符,即自由函数,而不是成员函数。

std::cout.operator<<("Hello world").operator<<(std::endl);

使用const void*的重载输出运算符,因为const char*可以隐式转换为const void*

您可以查看member overloads herefree overloads here

答案 1 :(得分:5)

我敢打赌,std::ostream(char*)的成员函数运算符不会过载。

如果您查看ostream::operator<<void*是最佳匹配,char*自然会转换为它,而全局operator<<(std::basic_ostream)则具有char*的确切重载类型,它被拿起来。

当然,他们的行为也不同。

答案 2 :(得分:1)

正如其他答案所说,问题是你明确地调用了operator <<的成员函数const char*,而const char*没有重载。

要获得operator <<重载,您需要调用适当重载的免费operator<<(std::cout, "Hello World").operator<<(std::endl); 函数:

operator <<

同样,编写std::ostream& (*)(std::ostream&)std::endl没有自由函数重载,因此std::cout << ...必须使用成员函数。

从这一点,我们可以看到你不能从中缀运算符语法(operator << (...))重写函数调用语法({{1}})而不失一般性。