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

时间:2014-12-01 11:20:20

标签: c++ c++11

假设有一个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;
   }

有意义吗?

我的问题在于插入运算符(&gt;&gt;)会发生什么。我也重载了它,将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;
}

我知道如果运营商&lt;&lt;返回void然后编译器评估cout&lt;&lt; p <&lt; ENDL; 由于优先级/关联性规则,它将该表达式计算为(cout&lt;&lt;&lt; cbs)&lt;&lt; ENDL ;. cout&lt;&lt; cPoint调用我们的void返回重载运算符&lt;&lt; function,返回void。然后,部分评估的表达式变为:void&lt;&lt; endl;,这没有任何意义!

但是在&gt;&gt;的情况下会发生什么。为什么我不能为&gt;&gt;返回空格如:

    void operator>> (std::istream &cin, Point &p);

因为如果cin&gt;&gt;无关紧要p返回void或其他内容。没有其他操作数可以使用它。目前尚不清楚。

2 个答案:

答案 0 :(得分:9)

可以从流提取void返回operator >>,就像您可以从插入void的流中返回operator <<一样。就像插入一样,它会阻止你进行链接:

cPoint p, q;
cin >> p >> q; // This would fail with return type void

...和非常常见的测试正确性成语:

cPoint p;
if (cin >> p) {
}

答案 1 :(得分:3)

  

我重载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会阻止您在同一行上的点之后阅读其他任何内容。