c++ - 在重载的 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;
解决方案
您会发现这篇文章(由 Onur Uzun 撰写)很有用:https ://medium.com/@nonuruzun/overloading-input-output-operators-in-c-a2a74c5dda8a
正如他在那里所说:
“cout 是 ostream 类的对象,它是编译器定义的类。当我们执行 cout<<obj 时,其中 obj 是我们类的对象,编译器首先在 ostream 中查找运算符函数,然后查找全局函数。重载插入运算符的一种方法是修改 ostream 类,这可能不是一个好主意。所以我们创建了一个全局方法,如果我们想让它们访问类的私有数据成员,我们必须让它们成为朋友。
我希望能回答你的问题。
推荐阅读
- javascript - 在 fetch 中接收到数据后输出
- java - 检查我是否在迷宫中越界
- c# - WCF 服务 - 更改 httpsbinding 的时钟偏差
- here-api - 目的地靠近高速公路的矩阵路线
- excel - vba excel比较日期值
- php - jQuery 代码生成的空 JSON 对象在 PHP 代码中被错误解析为空字符串
- modelica - 在 Dymola 的初始化过程中,非线性求解器无法收敛
- java - 如何将异常集合作为根本原因传递?
- macos - 远程文件“存根”如何在带有 APFS 的 Mac 上工作?
- java - 列表中字符串值的 CrudRepository 过滤器
财产