【问题标题】:Understanding behavior of cout.operator<<()了解 cout.operator<<() 的行为
【发布时间】:2017-11-08 22:30:09
【问题描述】:

根据this question 的最高答案,cout &lt;&lt; expr 等价于cout.operator&lt;&lt;(expr)

根据this question的回复,以上说法不实。

根据我自己的测试,cout.operator&lt;&lt;()cout &lt;&lt; 在给定整数时是一样的。当给定一个浮点数时,cout.operator&lt;&lt;() 将其强制为一个整数。当给定一个字符串文字时,如cout.operator&lt;&lt;("hello world"),它会输出似乎是内存地址的内容。当给定一个包含 std::string 的变量时,它会给出编译器错误。

任何人都可以对发生的事情进行初级到中级的解释吗?

【问题讨论】:

  • "cout &lt;&lt; expr 等同于 cout.operator&lt;&lt;(expr)" 并非普遍正确。第二个问题+第一个评论的答案解释了这一点。不确定这是否算作重复......也许这会有所帮助:stackoverflow.com/questions/36809463/…

标签: c++ operator-overloading iostream cout


【解决方案1】:

取决于expr

这两个问题的答案都是针对具体情况,而不是一揽子保证。

其实operator&lt;&lt;有的是freefunctions,有的是member functions

请查阅您最喜欢的 C++ 参考资料以找出哪个。

【讨论】:

    【解决方案2】:

    cout &lt;&lt; exprcout.operator&lt;&lt;(expr) 的等效性取决于 expr 是什么。

    如果它是cout“知道”的“内置”类型,那么是的,它相当于cout.operator&lt;&lt;(expr)(成员函数)。

    如果它是“用户类型”(std::string 也算在内),那么它就是一个重载的非成员方法,其签名类似于 std::ostream&amp; operator&lt;&lt;(std::ostream&amp;, const std::string&amp;); 等。

    为什么cout.operator&lt;&lt;("hello world")会打印内存地址?

    上面最好的成员方法重载(因为它被强制使用成员方法,是ostream&amp; operator&lt;&lt;(const void* value);,它输出指针的值(不是指向的值)。

    相比之下,cout &lt;&lt; "hello world" 调用非成员重载ostream&amp; operator&lt;&lt;(ostream&amp;, const char*),而这又将每个字符插入到输出中。

    【讨论】:

      猜你喜欢
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多