首页 文章

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

提问于
浏览
3

假设有一个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或其他什么并不重要 . 没有其他操作数可以使用它 . 目前尚不清楚 .

2 回答

  • 9

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

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

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

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

    我重载了运算符<<就像......

    正确覆盖应采用 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 将阻止您在同一行上的点之后读取任何其他内容 .

相关问题