以下批量运算>>
运算符的方法之间有什么区别?
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
。
第一种方式不是超载的合法方式吗?
答案 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
,但这并不是很有意义。