程序的目的是获取输入,将这些值分配给类的成员并显示输出,输入和输出操作通过重载流操作符来完成。
#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;
}
在示例中,如果数据来自输入流&#39; cin&#39;并且这些值是在函数内部分配的,为什么要在#t;退回来。我已经看到所有教程都在运算符重载函数中返回流。返回值的目的是什么?
答案 0 :(得分:4)
在示例中,如果数据来自输入流
cin
并且值是在函数内部分配的,那么为什么要返回istream
?
这样做是为了允许“链接”。
操作员从>>
的两侧获取两个参数。流来自左侧,变量来自右侧。当你这样做时
cin >> x >> y;
第一个表达式cin >> x
位于第二个表达式的左侧,这意味着cin >> x
的结果变为... >> y
的输入流。这就是为什么操作员需要返回已传入其中的相同输入流。
答案 1 :(得分:2)
您认为以下哪些方法有效?
stream >> ob.x >> ob.y;
这与:
完全相同(stream >> ob.x) >> ob.y;
那么stream >> ob.x
的价值是什么?
答案 2 :(得分:2)
“返回值的目的是什么?”
目的是,这些操作可以链接在诸如
之类的语句中MyClass abt(30,23);
int y;
cout << abt << endl;
// ^^^^^^^
cin >> abt >> y;
// ^^^^
答案 3 :(得分:0)
cout
和cin
通过<iostream>
和istream
的子级ostream
相互关联。现在我们要将运算符重载为全局函数,因为作为成员重载,运算符必须是左侧对象的成员。另外,为了使泛型流的功能,我们必须传递引用而不是值。因此我们必须选择使用友元功能重载它们。
因此:
istream & operator>>(istream &din,vector &vtemp)
现在din
的工作方式与cin
类似,因为din
引用了cin
。现在使用din
我们扫描对象的数据成员。扫描后,我们必须链接它们(流)。因此,必须将引用返回到cin
。