[英]why overloading of operator<< must return by reference?
我想打印出一个用户定义类型的对象,比如这个cout << ob1;
and 所以我想重载operator <<并且我希望按值返回而不是通过引用但是它给了我一个错误:在两个名为的文件中: 和
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)有什么解释吗?
在第一个示例中,您返回了一个不允许的流对象的副本,因为C ++中所有流类的复制构造函数(以及复制赋值)已被禁用,因为它们是private
。
由于您无法复制流对象,因此您需要通过引用返回它,您在第二个示例中执行此操作,这就是它工作正常的原因。
您可以选择根本不返回任何内容(即,您可以使返回类型为void
),但如果您这样做,那么您将无法链接为stream << a << b
。 你要将它们分别写成stream <<a
然后stream << b
。
如果您想知道为什么禁用复制流对象,请在此处查看我的答案:
流是不可复制的,因为复制流并不真正有意义,流是唯一的(你不能在同一条河中跳两次)。 按值返回是在C ++ 03中至少复制事务。
如果有理由要按值返回,则按引用返回的是正确的版本。
这样做是为了支持安全合理的操作员链接
cout<<a<<b;
因为返回引用而起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.