TransWikia.com

Перезагрузка оператора ввода: почему возвращаемый тип должен быть istream?

Stack Overflow на русском Asked on August 30, 2021

Вот пример моей перезагрузки для класса BigInteger:

istream& operator >>(istream& in, BigInteger& object)
{
    string input;
    in >> input;
    for (auto i = input.rbegin(); i != input.rend() ; i++)
    {
        object.digits.push_back(*i);
    }
    return in;
}

int main()
{
    BigInteger a;
    cin >> a;
}

То есть, я получаю свои числа на вход, ввожу их в свою переменную a и… возвращаю тип istream? а зачем? по идее на данном же можно завершить все это дело? почему я не могу сделать вот так:

void operator >>(istream& in, BigInteger& object)
    {
        string input;
        in >> input;
        for (auto i = input.rbegin(); i != input.rend() ; i++)
        {
            object.digits.push_back(*i);
        }
    }

One Answer

Чтобы можно было делать цепочку вызовов

int main()
{
    BigInteger a, b;
    cin >> a >> b;
}

Выполняться будет так:

(cin >> a) >> b;

поэтому результат (cin >> a) должен возвращать istream&, чтобы на нём опять можно было вызвать оператор >>.

Операторы по сути те же самые функции и в данном случае цепочка превратится в следующее:

operator>>(operator>>(std::cin, a), b);

т.е. результат одного вызова функции operator>> подставляется как аргумент в другой operator>> на позицию, которая принимает iostream.

Пример цепочки для вызова member операторов:

int a, b;
cin.operator>>(a).operator>>(b);

Тут даже более явно видно, что у объекта cin вызывается функция operator>> с аргументом a и на результате опять вызывается operator>> с аргументом b. Если бы operator>> ничего не возвращал, то и вызвать .operator>>(b) не получилось, ведь объекта нет, на котором вызывать функцию.

Correct answer by IR42 on August 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP