Перезагрузка оператора ввода: почему возвращаемый тип должен быть istream?
Вот пример моей перезагрузки для класса 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);
}
}
Ответы (1 шт):
Чтобы можно было делать цепочку вызовов
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) не получилось, ведь объекта нет, на котором вызывать функцию.