【问题标题】:c++ overloading operator << why & needed?c++ 重载运算符 << 为什么需要 &?
【发布时间】:2020-04-02 07:27:31
【问题描述】:
ostream& operator<<(ostream& cout, const Complex& num) {
    std::cout << num.a << "+i" << num.b;
    return std::cout;
}

当我重载&lt;&lt; 运算符时,为什么我必须在ostream 旁边编码&?

【问题讨论】:

  • 查看您的 c++ 书籍/在线资源并了解什么是参考。
  • 第二行有错误;那应该是cout,没有std::
  • 我知道什么是引用...我不知道为什么在这种情况下它是必要的
  • @SunHyuckHwang。不,您需要删除两者的std::。请参阅下面的答案,尽管您的第二个版本比第一个更好,但如果您使用 std::cout 作为唯一的 ostream 对象

标签: c++ operator-overloading ostream


【解决方案1】:

因为

返回类型:

  • ostream 对象不可复制,因此除非您执行 move 操作,否则它们不能用作返回类型。

用于参数:

  • ostream 对象不可复制,因此除非您执行move 操作,否则它们不能用作参数的类型。
  • 预计operator &lt;&lt;可能会改变参数的状态,所以我们应该通过引用传递。

考虑到参数的第二个原则,您的代码应更正为:

ostream& operator<<(ostream& cout, const Complex& num) {
    cout << num.a << "+i" << num.b;
    return cout;
}

【讨论】:

  • 所以在c++中&作为参考,移动操作符?
  • @SunHyuckHwang 不,我的意思是如果你不使用std::ostream&amp;,你需要在调用操作符函数时进行移动操作。例如std::cout &lt;&lt; Complex();如果你使用std::ostream而不是std::ostream&amp;会产生编译错误
  • @SunHyuckHwang 另外,那你不能简单地return cout,你需要写return std::move(std::cout),很奇怪,不是吗?在move 你的std::cout 变得无法使用之后,所以不要使用它。我介绍这个只是为了让我的答案更准确。
猜你喜欢
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 2012-04-23
  • 2021-12-02
  • 2012-03-09
  • 2014-05-29
  • 1970-01-01
相关资源
最近更新 更多