我想打印出一个用户定义类型的对象,比如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)任何解释?
答案 0 :(得分:13)
在第一个示例中,您返回了一个不允许的流对象的副本,因为C ++中的所有流类的复制构造函数(以及复制赋值)被禁用他们做了private
。
由于您无法复制流对象,因此您需要通过 reference 返回它,您在第二个示例中执行此操作,这就是它工作正常的原因。
您可以选择根本不返回任何内容(即您可以返回void
类型),但如果您这样做,那么您将无法链作为{{ 1}}。您需要将它们分别写为stream << a << b
,然后stream <<a
。
如果您想知道为什么禁止复制流对象,请在此处查看我的答案:
答案 1 :(得分:1)
Streams是不可复制的,因为复制流并没有多大意义,流是唯一的(你不能在同一条河里跳两次)。按值返回至少在C ++ 03中复制事务。
如果您想要按值返回,则按引用返回的是正确的版本。
答案 2 :(得分:0)
这样做是为了支持安全合理的操作员链接,如
cout<<a<<b;
因返回引用而起作用。