我想打印出一个用户定义类型的对象,像这样 cout << ob1;
所以我想重载 operator<< 并且我想按值而不是按引用返回,但它给了我一个错误:在两个名为 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)有什么解释吗?
最佳答案
在第一个示例中,您返回了不允许的流对象拷贝,因为 C++ 中所有 流类的复制构造函数(以及复制赋值)已被禁用让他们制作private
.
由于您无法制作流对象的拷贝,因此您需要通过引用 返回它,这是您在第二个示例中所做的,这就是它工作正常的原因。
您可以选择什么都不返回(即您可以将返回类型设置为 void
),但如果您这样做,那么您将无法链接为 stream << a << b
.您必须将它们分别写为 stream <<a
然后 stream << b
.
如果您想知道为什么无法复制流对象,请在此处查看我的回答:
关于c++ - 为什么 operator<< 的重载必须通过引用返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646893/