перегрузка >> оператор внутри класса - PullRequest
0 голосов
/ 08 мая 2018

В чем разница между следующими способами oveload оператора >>?

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 голосов
/ 08 мая 2018

Нет, первое не является "законным", потому что обычно вы хотите, чтобы >> принял istream в качестве аргумента левой стороны, но ваша функция-член принимает A в качестве левой стороны- боковой аргумент (как this), что означает, что вы не можете вызвать std::cin >> a, но вы можете вызвать a >> std::cin, что не имеет особого смысла.

0 голосов
/ 08 мая 2018

Когда вы выполняете перегрузку оператора внутри члена, тогда левая часть этого оператора является экземпляром класса.

Например, с вашим 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...