что означает тип оператора и возвращаемого значения?

Итак, по моим сведениям,

istream& operator >> (istream &in, int &n);

это объявление о том, как работает >> (или как-то перегрузить его)

Но я запутался в возвращаемом типе этой "функции", "istream&".

Если я сделаю что-то вроде cin >> x; это означает, что я вставляю ссылку на x, но я не понимаю возвращаемый тип istream & и параметр «in».

Как будет выглядеть эта функция? что в"? А что на самом деле ВОЗВРАЩАЕТСЯ? Поскольку cin >> x действительно делает что угодно, но не принимает входные данные, так почему он должен что-то возвращать?

Спасибо!


person ming    schedule 27.10.2019    source источник
comment
это ссылка на istream. - и istream& operator >> (istream &in, int &n); означает, что n будет изменено - в отличие от const <type>&n   -  person Ted Lyngmo    schedule 27.10.2019
comment
Возврат ссылки на поток — это то, что позволяет использовать такие конструкции, как cin >> x >> y.   -  person jkb    schedule 27.10.2019
comment
Как следует из вашего названия, &operator нет. Имя функции — operator >> (два токена), а & — несвязанный токен, используемый для обозначения ссылочного типа. Так что &operator не вещь.   -  person curiousguy    schedule 27.10.2019
comment
@curiousguy Хорошо подмечено - я изменил это   -  person Ted Lyngmo    schedule 27.10.2019
comment
@TedLyngmo Я не вижу в вашем коде оператора адреса.   -  person curiousguy    schedule 27.10.2019
comment
@curiousguy Я только изменил &operator на operator& - это было мое ага на твой комментарий. - в ОП: вопрос.   -  person Ted Lyngmo    schedule 27.10.2019
comment
@TedLyngmo Нет operator&, а operator>>   -  person curiousguy    schedule 27.10.2019
comment
@curiousguy Вопрос был в том, что означает тип возвращаемого значения &operator? - Я только изменил его на то, что означает тип оператора и возвращаемого значения? - а я сделал как реакцию на ваш комментарий. Может быть, не правильная причина, но все же хорошо, я думаю.   -  person Ted Lyngmo    schedule 27.10.2019
comment
@TedLyngmo В коде есть istream& operator >> , который можно записать вместе с символами &operator, так как в любом случае это два отдельных токена. ОП должен уточнить, есть ли адрес оператора!   -  person curiousguy    schedule 27.10.2019
comment
Мы не говорим об одном и том же. Я изменил тему, против которой вы возражали. Вот и все.   -  person Ted Lyngmo    schedule 27.10.2019
comment
@curiousguy - мы договорились или все еще есть какое-то неправильное представление о том, в чем заключалась моя поправка к вопросу?   -  person Ted Lyngmo    schedule 27.10.2019
comment
@TedLyngmo Название, по крайней мере, не имеет смысла само по себе, поскольку operator& отличается от &operator, но оно может не отражать намерения ОП; Я догадался, что он написал &operator в заголовке, потому что эти две лексемы появляются вместе в его коде. Возможно, он имел в виду что-то вроде &operator>>(...).   -  person curiousguy    schedule 27.10.2019
comment
О, если я изменил намерение ОП: приношу свои извинения. Я не получил этот комментарий от ОП ранее.   -  person Ted Lyngmo    schedule 27.10.2019
comment
@curiousguy Вы согласны с моей правкой, если ОП?   -  person Ted Lyngmo    schedule 27.10.2019
comment
@TedLyngmo Если это был вопрос ОП, я согласен с вашим редактированием, но я думаю, что ОП запутался в синтаксисе. Теперь очередь ОП отвечать!   -  person curiousguy    schedule 27.10.2019
comment
Привет, ребята, если честно, я новичок в С++, поэтому я не следил за всем этим взаимодействием, но мой вопрос действительно был связан только с типом того, что возвращает эта функция, я не понял, как этот оператор перегружает работал в целом, не уделяя слишком много внимания ссылке и тому, куда она идет. Меня больше беспокоило то, что функция делала и высматривала. Спасибо! @любопытный парень   -  person ming    schedule 27.10.2019
comment
@TedLyngmo ^^, не знаю, почему я не могу уведомить вас обоих   -  person ming    schedule 27.10.2019
comment
@ming Вам нужно научиться расшифровывать удивительный, но внутренне непротиворечивый принцип C/C++ объявления вещей (переменных или функций). Это называется декларатор: & operator >> (istream &in, int &n). Видите, & является его частью, но не частью имени функции, которое просто operator >>. Он гласит: вызов operator >> с изменяемым lvalue istream и одним из int формально возвращает ссылку, то есть дает lvalue. lvalue — это выражение, которое ссылается на идентифицированный объект.   -  person curiousguy    schedule 27.10.2019
comment
Да, наш учитель упомянул lvalues, но особо в них не вдавался, так что это меня немного смущает. Разве & не означает ссылку? Итак, оператор ›› — это имя функции, а istream& — тип возвращаемого значения? В таком случае я действительно не понимаю & здесь. И когда вы говорите, что lvalue — это выражение, относящееся к идентифицированному объекту, это просто означает, что слева в основном есть что угодно, но правая часть = должна иметь адрес? Это то, что я вынес из класса.. @curiousguy   -  person ming    schedule 27.10.2019
comment
@ming Если вы знаете lvalue, вы не можете понять значение и цель ссылок. & объявляет ссылку, использование функции, возвращающей ссылку, является lvalue. Это как если бы функция возвращала имя или обозначение объекта.   -  person curiousguy    schedule 27.10.2019


Ответы (3)


Стандартная реализация оператора >> вернет ссылку на параметр istream &in, что означает, что он возвращает точно такой же объект.

Это сделано для удобства, поэтому вы можете написать такой код: cin >> x >> y;

Компилятор возьмет то, что находится слева от оператора, и поместит его в первый параметр, а правый — в второй< /сильный>. cin >> x >> y преобразуется в operator>>( (operator>>(cin, x), y );

Это сначала добавит x к потоку и использует возврат, сам поток, и запишет y в него.

person Pontus Holmbom    schedule 27.10.2019

Если функция,

istream& operator >> (istream &in, int &n);

вместо этого вернулся

istream operator >>....

Затем все усложняется. В худшем случае каждый вызов >> будет копировать объект потока и возвращать копию, которая затем будет скопирована и сохранена в стеке вызывающего объекта, после чего будут вызваны деструкторы всех тех вещей, которые были скопированы, за исключением особых обстоятельств.

Возвращая ссылку, мы можем делать такие вещи, как цепочка:

a << b << "Yo!" << c << "Wassup?" << endl;

...без всей этой ерунды.

& означает «ссылка», которая по сути является указателем с более строгой проверкой во время компиляции и более удобным синтаксисом.

person 3Dave    schedule 27.10.2019
comment
Внутри он реализован как указатель, но с точки зрения синтаксиса и семантики это не так. Выражение, использующее ссылку, относится к объекту, а не к его адресу. - person curiousguy; 27.10.2019
comment
ОК... Мой предыдущий непрочитанный комментарий удален с позором, пожалуйста, сделайте то же самое. - person curiousguy; 27.10.2019

Это означает, что в этом конкретном случае (и многих других) это сквозной. Это контракт на возврат чего-то разумного с учетом введенных данных. Возврат is — разумная вещь, поскольку он создает такие конструкции, как:

stream >> variableA >> variableB >> variableC

возможно. Это потому, что stream >> variableA возвращает stream, как и другие операции.

person Ted Lyngmo    schedule 27.10.2019
comment
О, да, я забыл, что были разные выходные потоки, поэтому поток, как в вашем примере, будет похож на cout или outfile, верно? Значит ли это, что технически, если мы передаем cin, мы можем вернуть outfile? И скажем, что мы удваиваем каждое целое число n, которое мы передаем. Тогда как это новое n также возвращается, если единственное, что мы возвращаем, — это выходной поток? Например, если мы вводим параметры, то в ответ мы получаем только поток, который мы ввели (например, cin), или новый поток (outfile). - person ming; 27.10.2019
comment
@ming Очень даже - это очень открытый язык, но очень разборчивый в том, что он принимает :-) - person Ted Lyngmo; 27.10.2019
comment
@ming Канонический импл всех операторов чтения/записи (op‹‹ op››) равен return lhs; (для не члена) или return *this; (для члена) - person curiousguy; 29.10.2019