为什么重载运算符<<必须通过参考回复?

时间:2012-03-10 13:41:16

标签: c++ overloading operator-keyword

我想打印出一个用户定义类型的对象,比如cout << ob1; 所以我想重载operator&lt;&lt;我希望按值而不是通过引用返回,但它给了我一个错误:在两个名为: iosfwd 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)任何解释?

3 个答案:

答案 0 :(得分:13)

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

由于您无法复制流对象,因此您需要通过 reference 返回它,您在第二个示例中执行此操作,这就是它工作正常的原因。

您可以选择根本不返回任何内容(即您可以返回void类型),但如果您这样做,那么您将无法作为{{ 1}}。您需要将它们分别写为stream << a << b,然后stream <<a

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

答案 1 :(得分:1)

Streams是不可复制的,因为复制流并没有多大意义,流是唯一的(你不能在同一条河里跳两次)。按值返回至少在C ++ 03中复制事务。

如果您想要按值返回,则按引用返回的是正确的版本。

答案 2 :(得分:0)

这样做是为了支持安全合理的操作员链接,如

    cout<<a<<b;  

因返回引用而起作用。