|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
03.08.2017, 10:40 | #1 |
Форумчанин
Регистрация: 09.04.2017
Сообщений: 598
|
Перегрузка cout и cin
Здравствуйте!
Прошу помочь понять поточнее происходящее в программе. В принципе так-то всё понятно, но хочется более внятно понимать так сказать "закулисную" деятельность))) Код:
istream& operator >> (istream& s, Distance& d) происходит что? Как понимаю я: по ссылке к классу istream создаётся объект s класса istream, создаётся поток извлечения для второго аргумента класса Distance связь с которым тоже по ссылке, для объекта d (для определённого поля). Когда данные извлечены из клавиатуры в ОП, объект s возвращается по ссылке в main. Вопрос: куда? к кому? К cin? Так ведь s уже по идее извлёк данные в ОП... |
03.08.2017, 11:03 | #2 | |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
Цитата:
Просто создали функцию с особым именем "operator >>", возвращающую ссылку на объект istream и принимающую два аргумента: ссылки на объект istream и какой-то ваш объект (по ссылке чтоб не было лишнего копирования). Когда вы используете >> с значениями подходящих типов компилятор вызовет эту функцию. (если что, cout и cin это глобальные переменные с типом ostream/istream) То есть при Код:
Код:
Код:
Код:
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 03.08.2017 в 11:07. |
|
03.08.2017, 14:17 | #3 |
Форумчанин
Регистрация: 09.04.2017
Сообщений: 598
|
))
Спасибо. Вот не знал я, что такое "распарсить". Но по смыслу понял, что это значит, что человек не расшифровал, не понял смысл. потом глянул в сети и узнал наверняка)) Совпало)) Так вот и по смыслу программы. Я понимаю что там делается. понимаю что на что и как влияет. Но вот почему именно так это записывается, какова логика написания именно так - не понимаю. Это и хотел спросить, этак немного коряво)) Просто зазубрить что и как взаимодействует мне мало. Я хочу понимать суть, корни происходящего. Вы немного прояснили суть. Спасибо)) Там в теле функции есть Код:
Последний раз редактировалось KAMLS; 03.08.2017 в 14:20. |
03.08.2017, 15:16 | #4 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,707
|
Давайте по порядку:
Допустим есть некоторый класс А с каким-то набором методов и вы хотите расширить его функциональность, например, чтобы его func1(int a) могла принимать в качестве параметра ваш тип. Какие у вас варианты? 1. Влезть в класс, изменить его дописав нужную функцию. Но стримовские классы это часть стандартной библиотеки и не очень хорошо так делать. Тем более что вам придется распространять измененную std со своей прогой. 2. Отнаследоваться от А и добавить перегрузку функции. Как-то многовато телодвижений. 3. Что собственно тут и происходит. Создать свободную функцию, первым параметром, естественно, будет класс A, а втором аргументом ваш параметр. Все работает и вам достаточно только дописать одну функцию. Ссылка возвращается, чтобы можно было создавать "цепочки". |
03.08.2017, 15:58 | #5 | |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Цитата:
YourClassInstance << cin или YouClassInstance >> cout что несколько не интуитивно. По сути нужно добавить метод в класс cin/cout. Именно для этого для математических операторов допустима запись operator XXX(lvalue, rvalue) вне декларации класса. |
|
03.08.2017, 16:28 | #6 |
Форумчанин
Регистрация: 09.04.2017
Сообщений: 598
|
Кое-что проясняется, спасибо. Но вот этот вот вопрос:
Там в теле функции есть Код: s>>d.feet; Вот это s, это ведь объект istream? Типа вместо cin? Строка 20 и 21 Код:
|
03.08.2017, 16:30 | #7 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,707
|
Это не вместо, это параметр функции. Передадите туда cin будет из него брать, передадите другой - из другого.
|
03.08.2017, 17:58 | #8 |
Форумчанин
Регистрация: 09.04.2017
Сообщений: 598
|
Да, параметр функции operator>>, типа данных "объект класса istream" передаваемого по ссылке в переменную называемую "s" употребляемую внутри этой функции во время действия этой функции.
Но у класса istream много разного функционала, его объекты могут многое. Стало быть символ ">>" указывает что данный объект будет работать на извлечение? Так? Более того, поскольку этот объект возвращается по ссылке в main, он содержит в себе введённые в функции поля значения класса Distance? Так? И во время выполнения cin>>dist1>>dist2; он возвращает значения полей объекта dist1 а потом dist2 и записывает данные в поля этих объектов? Или это происходит сразу во время выполнения функции? А зачем тогда возврат значения по ссылке? Вот как-то так у меня вопросы роятся))))) |
03.08.2017, 18:06 | #9 |
Старожил
Регистрация: 12.01.2011
Сообщений: 19,500
|
чтобы можно было к нему снова применить что-то (без разделения на несколько statement'ов), смотрите мой пример.
Или вопрос был почему не по значению? Чтоб не копировать. А, и еще в >> аргумент должен быть по ссылке потому что вам ж надо писать туда. там нет магии, что написано, то и происходит. Смотрите мой пример.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом. Последний раз редактировалось Alex11223; 03.08.2017 в 18:17. |
04.08.2017, 06:37 | #10 |
Форумчанин
Регистрация: 09.04.2017
Сообщений: 598
|
Спасибо.
Там я интересовался, что быть может в поля объекта Distance значения записываются во время выполнения функции? Я так делал когда возвращаемым значением функции бывало void. Код:
Последний раз редактировалось KAMLS; 04.08.2017 в 06:56. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
перевести программу на с++ т.е printf|scanf на cout |cin очень нужно | Faridun | Общие вопросы C/C++ | 6 | 18.04.2013 22:54 |
перевести программу на с++ т.е printf|scanf на cout |cin очень нужно | Faridun | Visual C++ | 0 | 16.04.2013 14:18 |
cout., cin., cout.setf, cout.unsetf | kineziz | Общие вопросы C/C++ | 1 | 06.05.2012 02:50 |
Разница между cout/cin && printf/scanf | treis1000 | Общие вопросы C/C++ | 7 | 20.03.2012 18:49 |