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);
}
}
Чтобы можно было делать цепочку вызовов
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP