Когда вы выполняете перегрузку оператора внутри члена, тогда левая часть этого оператора является экземпляром класса.
Например, с вашим 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)