流操作符重载的返回类型

时间:2015-02-25 02:19:38

标签: c++ inputstream

程序的目的是获取输入,将这些值分配给类的成员并显示输出,输入和输出操作通过重载流操作符来完成。

#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;退回来。我已经看到所有教程都在运算符重载函数中返回流。返回值的目的是什么?

4 个答案:

答案 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)

coutcin通过<iostream>istream的子级ostream相互关联。现在我们要将运算符重载为全局函数,因为作为成员重载,运算符必须是左侧对象的成员。另外,为了使泛型流的功能,我们必须传递引用而不是值。因此我们必须选择使用友元功能重载它们。 因此:

istream & operator>>(istream &din,vector &vtemp)

现在din的工作方式与cin类似,因为din引用了cin。现在使用din我们扫描对象的数据成员。扫描后,我们必须链接它们(流)。因此,必须将引用返回到cin