【问题标题】:why overloading of operator<< must return by reference?为什么 operator<< 的重载必须通过引用返回?
【发布时间】:2012-03-10 13:41:15
【问题描述】:

我想打印出用户定义类型的对象,例如cout &lt;&lt; ob1; 所以我想重载 operatoriosfwd 和 ios_base.h

ostream operator<<( ostream& out, cat& rhs){
    out << rhs.a << ", " << rhs.b << endl;
    return out ; 
}

1)是不是因为不能创建新的ostream对象,所以必须引用返回?

但是当我像这样通过引用返回时:

ostream& operator<<( ostream& out, cat& rhs){
    out << rhs.a << ", " << rhs.b << endl;
    return out ;
}

它工作正常。
2)有什么解释吗?

【问题讨论】:

  • 你得到什么错误信息?
  • 还有,为什么要按值返回?
  • 附带说明,在您的运算符中使用 endl 会使输出您的类型(意外)刷新 iostream。你可能想跳过它,或者如果你真的想输出到多行,输出一个'\n'代替。
  • @JoachimIsaksson 我猜 endl 对象会正常工作,因为我没有为 endl object 的类型重载 operator
  • @AlexDan 是的,使用它没有问题,不仅仅是 endl 不仅输出换行符,它还刷新流,这需要更多时间。

标签: c++ overloading operator-keyword


【解决方案1】:

在第一个示例中,您返回了一个不允许的流对象的副本,因为 C++ 中 所有 流类的复制构造函数(以及复制赋值)已被禁用通过让他们制作private

由于您无法制作流对象的副本,因此您需要通过 reference 将其返回,这就是您在第二个示例中所做的,这就是它工作正常的原因。

您可以选择不返回任何内容(即您可以将返回类型设为void),但如果这样做,您将无法链接stream &lt;&lt; a &lt;&lt; b。您必须将它们分别写为stream &lt;&lt;a,然后是stream &lt;&lt; b

如果您想知道为什么流对象的复制被禁用,请在此处查看我的答案:

【讨论】:

    【解决方案2】:

    流是不可复制的,因为复制流没有任何意义,流是独一无二的(你不能两次在同一条河流中跳跃)。按值返回至少在 C++03 中复制事务。

    如果有理由要按值返回,按引用返回是正确的版本。

    【讨论】:

      【解决方案3】:

      这样做是为了支持安全合理的算子链式

          cout<<a<<b;  
      

      因为返回引用而起作用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-09
        • 1970-01-01
        • 2012-02-08
        • 1970-01-01
        • 2015-06-24
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多