重载>>课堂内的操作员

时间:2018-05-08 12:09:57

标签: c++ operator-overloading

以下批量运算>>运算符的方法之间有什么区别?

class A {
public:
    istream& operator>>(istream& is) { return is >> x; };
private:
    int x;
};

class B {
public:
    friend istream& operator>>(istream& is, B b) { return is >> b.y; };
private:
    int y;
};

我无法使用std::cin >> a,但我可以std::cin >> b

第一种方式不是超载的合法方式吗?

2 个答案:

答案 0 :(得分:4)

当您对运算符进行成员内重载时,该运算符的左侧是该类的实例。

例如,使用A类:

A a;
a >> std::cin;  // Calls a.operator>>(std::cin)

当您为类friend声明B函数时,它不是成员函数,而是非成员函数。它与做

基本相同
class B {
public:
    friend istream& operator>>(istream& is, B b);  // Just declare the function
private:
    int y;
};

// Here's the function definition
istream& operator>>(istream& is, B b) { return is >> b.y; };

使用此函数,左侧作为第一个参数传递,右侧作为第二个参数传递。

这意味着

B b;
std::cin >> b;  // Equal to operator>>(std::cin, b)

答案 1 :(得分:1)

不,第一个不是合法的"因为通常你希望>>istream作为其左侧参数,但是你的成员函数将A作为其左侧参数(如this }),这意味着您无法拨打std::cin >> a,但是您可以拨打a >> std::cin,但这并不是很有意义。