【问题标题】: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”。我已经看到所有教程都在运算符重载函数中返回流。返回值的目的是什么?

【问题讨论】:

    标签: c++ inputstream


    【解决方案1】:

    在示例中,如果从输入流cin 中获取数据,并且在函数内部分配了值,为什么要返回istream

    这样做是为了允许“链接”。

    运算符从&gt;&gt; 的两侧获取它的两个参数。流来自左侧,变量来自右侧。当你这样做时

    cin >> x >> y;
    

    第一个表达式cin &gt;&gt; x在第二个表达式的左边,也就是说cin &gt;&gt; x的结果变成了... &gt;&gt; y的输入流。这就是为什么运算符需要返回已传递给它的相同输入流。

    【讨论】:

      【解决方案2】:

      你认为以下是如何工作的?

      stream >> ob.x >> ob.y;
      

      这完全一样:

      (stream >> ob.x) >> ob.y;
      

      那么stream &gt;&gt; ob.x的价值是什么?

      【讨论】:

        【解决方案3】:

        “返回值的目的是什么?”

        目的是,这些操作可以链接在类似的语句中

        MyClass abt(30,23);
        int y;
        
        cout << abt << endl;
                 // ^^^^^^^
        
        cin >> abt >> y;
                // ^^^^
        

        【讨论】:

          【解决方案4】:

          coutcin通过&lt;iostream&gt;istreamostream的子类相互链接。现在我们将要重载运算符作为全局函数,因为作为成员重载,运算符必须是左侧对象的成员。此外,为了实现通用流的功能,我们必须传递引用而不是值。所以我们必须选择用友元函数重载它们。 因此:

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

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

          【讨论】:

            猜你喜欢
            • 2015-01-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-26
            • 2015-06-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多