流运算符重载中的返回类型
Posted
技术标签:
【中文标题】流运算符重载中的返回类型【英文标题】:return type in stream operator overloading 【发布时间】:2015-04-26 21:58:35 【问题描述】:程序的目的是接受输入,将这些值分配给类的成员并显示输出,输入和输出操作是通过重载流运算符来完成的。
#include <iostream>
using namespace std;
class MyClass
int x, y;
public:
MyClass(int i, int j)
x = i;
y = j;
friend ostream& operator<<(ostream &stream, MyClass ob);
friend istream& operator>>(istream &stream, MyClass &ob);
// friend void operator<<(ostream &stream, MyClass ob);
// friend void operator>>(istream &stream, MyClass &ob);
;
ostream& operator<<(ostream &stream, MyClass ob)
stream << ob.x << ' ' << ob.y << '\n';
return stream;
istream& operator>>(istream &stream, MyClass &ob)
stream >> ob.x >> ob.y;
return stream;
int main()
MyClass abt(30,23);
cin>>abt;
cout<<abt;
return 0;
在示例中,如果从输入流“cin”中获取数据,并且在函数内部分配了值,为什么要返回“istream”。我已经看到所有教程都在运算符重载函数中返回流。返回值的目的是什么?
【问题讨论】:
【参考方案1】:在示例中,如果从输入流
cin
中获取数据,并且在函数内部分配了值,为什么要返回istream
?
这样做是为了允许“链接”。
运算符从>>
的两侧获取它的两个参数。流来自左侧,变量来自右侧。当你这样做时
cin >> x >> y;
第一个表达式cin >> x
在第二个表达式的左边,也就是说cin >> x
的结果变成了... >> y
的输入流。这就是为什么运算符需要返回已传递给它的相同输入流。
【讨论】:
【参考方案2】:你认为以下是如何工作的?
stream >> ob.x >> ob.y;
这完全一样:
(stream >> ob.x) >> ob.y;
那么stream >> ob.x
的价值是什么?
【讨论】:
【参考方案3】:“返回值的目的是什么?”
目的是,这些操作可以链接在类似的语句中
MyClass abt(30,23);
int y;
cout << abt << endl;
// ^^^^^^^
cin >> abt >> y;
// ^^^^
【讨论】:
【参考方案4】:cout
和cin
通过<iostream>
istream
和ostream
的子类相互链接。现在我们将要重载运算符作为全局函数,因为作为成员重载,运算符必须是左侧对象的成员。此外,为了实现通用流的功能,我们必须传递引用而不是值。所以我们必须选择用友元函数重载它们。
因此:
istream & operator>>(istream &din,vector &vtemp)
现在din
的工作方式类似于cin
,因为din
引用了cin
。现在使用din
扫描对象的数据成员。扫描后,我们必须链接它们(流)。所以引用必须返回cin
。
【讨论】:
以上是关于流运算符重载中的返回类型的主要内容,如果未能解决你的问题,请参考以下文章