运算符“<<”重载返回类型

假设有一个cPoint类。

class cPoint {
  int x, y, z;
};

我想在一个语句中打印所有三个变量。 所以,我重载了operator <<就像

   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返回的重载操作符<<函数,它返回void。 然后部分评估的表达式变为:void << endl ;,这没有任何意义!

但是在>>的情况下会发生什么。 为什么我不能像>>一样返回void:

    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将阻止你读取同一行上的点之后的任何其他内容。

链接地址: http://www.djcxy.com/p/73147.html

上一篇: Operator "<<" overloading return type

下一篇: Purpose of returning by const value?