[英]Operator “<<” overloading return type
假设有一个cPoint类。
class cPoint {
int x, y, z;
};
我想在一个语句中打印所有三个变量。 所以,我重载了运算符<<就像
friend std::ostream& operator<< (std::ostream &cout, cPoint &p);
std::ostream& operator<< (std::ostream &out, cPoint &p) {
out << p.get_x() << " " << p.get_y() << " " << p.get_z() << std::endl;
return out;
}
说得通?
我的问题在于插入运算符(>>)会发生什么。 我也重载了它,将x,y和z的值转换为单个语句。
friend std::istream& operator>> (std::istream &cin, Point &p);
std::istream& operator>> (std::istream &in, Point &p) {
int tmp;
in >> tmp;
p.set_x(tmp);
in >> tmp;
p.set_y(tmp);
in >> tmp;
p.set_z(tmp);
}
明确?
int main() {
cout << p << endl;
cin >> p;
}
我知道如果operator <<返回void,那么编译器会计算cout << p << endl; 由于优先级/关联性规则,它将此表达式计算为(cout << cPoint)<< endl;。 cout << cPoint调用我们的void返回重载operator <<函数,它返回void。 然后部分计算的表达式变为:void << endl;,这没有任何意义!
但是在>>的情况下会发生什么。 为什么我不能像>>那样为>>返回一个空格:
void operator>> (std::istream &cin, Point &p);
因为cin >> p返回void或其他什么并不重要。 没有其他操作数可以使用它。 目前尚不清楚。
您可以从流提取operator >>
返回void
,就像您可以从流插入operator <<
返回void
一样。 就像插入一样,它会阻止你进行链接:
cPoint p, q;
cin >> p >> q; // This would fail with return type void
......以及非常常见的测试正确性成语:
cPoint p;
if (cin >> p) {
}
我重载了
operator <<
就像......
正确覆盖应该通过const
引用获取第二个参数:
friend std::ostream& operator<< (std::ostream &cout, const cPoint &p);
// ^^^^^
我也重载了它,将x,y和z的值转换为单个语句。
你忘in
从实施中退回:
std::istream& operator>> (std::istream &in, Point &p) {
int tmp;
in >> tmp;
p.set_x(tmp);
in >> tmp;
p.set_y(tmp);
in >> tmp;
p.set_z(tmp);
return in; <<== Here
}
使其void
将阻止您在同一行上的点之后读取任何其他内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.