首页 > 解决方案 > 在重载的 I/O 运算符中通过引用传递和返回 I/O 流

问题描述

class Distance {
   private:
      int feet;             
      int inches;          
      
   public:
      // required constructors
      Distance() {
         feet = 0;
         inches = 0;
      }
      Distance(int f, int i) {
         feet = f;
         inches = i;
      }
      friend ostream &operator<<( ostream &output, const Distance &D ) { 
         output << "F : " << D.feet << " I : " << D.inches;
         return output;            
      }

      friend istream &operator>>( istream  &input, Distance &D ) { 
         input >> D.feet >> D.inches;
         return input;            
      }
};

为什么我们需要在>>的重载运算符中输入输入的引用并返回输入的引用?当我尝试删除输入运算符参数中的&并返回正常输入时,为什么输入D3后istream仍然丢失数据。

friend istream &operator>>( istream  &input, Distance &D ) { 
         input >> D.feet >> D.inches;
         return input;            
      }
...
int main() {
   Distance D3;
   cin >> D3;//Input 4 5, data is not lost because pass by value???;
   cout << "Third Distance :" << D3 << endl;// Output 4 5
   int a=0;
   cin>>a;// Still require input data ????
   cout<<a;

标签: c++operator-overloading

解决方案


您会发现这篇文章(由 Onur Uzun 撰写)很有用:https ://medium.com/@nonuruzun/overloading-input-output-operators-in-c-a2a74c5dda8a

正如他在那里所说:

“cout 是 ostream 类的对象,它是编译器定义的类。当我们执行 cout<<obj 时,其中 obj 是我们类的对象,编译器首先在 ostream 中查找运算符函数,然后查找全局函数。重载插入运算符的一种方法是修改 ostream 类,这可能不是一个好主意。所以我们创建了一个全局方法,如果我们想让它们访问类的私有数据成员,我们必须让它们成为朋友。

我希望能回答你的问题。


推荐阅读