C++ 在重载I/O运算符中通过引用传递和返回I/O流 类距离{ 私人: 内特英尺; 整数英寸; 公众: //必需的构造函数 距离(){ 英尺=0; 英寸=0; } 距离(整数f,整数i){ 英尺=f; 英寸=i; } friend ostream&运营商D.inches; 返回输入; } };

C++ 在重载I/O运算符中通过引用传递和返回I/O流 类距离{ 私人: 内特英尺; 整数英寸; 公众: //必需的构造函数 距离(){ 英尺=0; 英寸=0; } 距离(整数f,整数i){ 英尺=f; 英寸=i; } friend ostream&运营商D.inches; 返回输入; } };,c++,operator-overloading,C++,Operator Overloading,为什么需要在>>的重载运算符中输入输入的引用并返回输入的引用? 当我试图删除输入运算符参数中的符号并返回正常输入时,为什么输入D3后istream仍然丢失数据 class Distance { private: int feet; int inches; public: // required constructors Distance() { feet =

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

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;            
      }
};
friend istream&operator>>(istream&input,Distance&D){
输入>>直径英尺>>直径英寸;
返回输入;
}
...
int main(){
距离D3;
cin>>D3;//输入4 5,数据不会因为传递值而丢失???;

您可以发现这篇文章(由Onur Uzun撰写)非常有用:

正如他在那里所说:

“cout是ostream类的对象,ostream类是编译器定义的类。
当我们这样做的时候,问题是为什么我们必须通过引用传递并返回输入的引用变量???关于friend函数,我已经理解了。这只是为了允许您在返回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;