Главная » Просмотр файлов » Г. Шилдт - Полный справочник по C++

Г. Шилдт - Полный справочник по C++ (1109478), страница 85

Файл №1109478 Г. Шилдт - Полный справочник по C++ (Г. Шилдт - Полный справочник по C++) 85 страницаГ. Шилдт - Полный справочник по C++ (1109478) страница 852019-04-28СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 85)

Ввод ноьзеровМ" з сова « "2. Вывод намеров1п"; санс « "3. Выкод1п"з самс « " хпвыберите пункт меню: сгп » с; ) мЫ1е(с<'1' (~ с>'3'); Бмзссн(с) саяе '1' з сзп» а; соас « "Выбранный пункт: сепг « а; // Вывод на экран. рЬ « а; // Запись на диск. Ъгсаки саве '2'з спаг ауп рЬ.яеекд(0, 1ояззЬед)з мЬ11е(!рЬ.еоб()) ( рь.Вес(сн)з гг(!рЬ.еаг()) сапе « сЬ; ) рЬ.с1еаг()з // Сброс признака канна файла.

сапе « епб1; Ьгеакз саяе '3'з рЬ.с1ояе(); гегпгп Оз ) ) ) Обрати~с внимание на то, что оператор "«" теперь можно использовать как для записи данных в файл на диске, так и лля вывода информации на экран без каких- либо изменений. Зто одно из наиболее важных и полезных свойств системы ввода- вывода языка С++. Часть Я. Язык С++ Полный справочник по 6 Ф 1 4 Дийамичесия идентифиация типА и Оперетеры приВедения В языке С-~< лля поддержки объектно-ориеюироваииого программирования исполыуется дппамическая идентификация типа ()(ТТ! — )<цп-Т)пзс Туре Ыеппбса. поп) и четыре лополпитсльиых оператора прпнедепия типон.

Ни одна из этих свойств пс упоминалось в исходной версии языка С++. Опи были добавлены нпоследствии для поддержки динамического полиморфизма. Система ВТТ! позволяет илентифициронать тип объекта при выполнении программы. Дополнительные операторы приведения типов обеспечивают более бсзопасцыи способ привслеиия. Г(оскальку олин из аз их операторов ~~ринедения (оператор <тупаа1с саве) непосредственно связан с системой динамической идентификации типов, имеет смысл рассмотреть их в одной главе.

~ Динамическая идентификация типа (ВТТЦ Динамическая плситификация типов пс характерна для таких исп(ииморфиых языков, как язык С. В этих языках псз. необходимости определять тип объекта при выполпепии программы, поскольку тип каждого обьекта изнесзеи еще ца этапе компиляции. Однако в полиморфцых языках, таких как С.(-+, возиика)от ситуации, в которых тип объекта на этапе компиляции неизвестен, поскольку природа этого объекга уточпяется только в ходе вь|полпепия программы.

Как описано в главе )7, язык С++ реализует полиморфизм с помощью иерархии классов, виртуальных функций и указателей иа обьскты базового класса. Поскольку указатели иа объекты базового класса могут ссылаться и па объекты производных классов, ие всегда можно предсказать, иа объект какого типа опи будут ссылаться в тот или иной момент.

Эту идентиФикацию приходится осуществлять в холе выполнения программы. Для илеитификации типа обьекта используется оператор еурейа, определенный н заголовке <Еурезплс>, Чаще всего оп примепяется в следующей форме. Зв) Гуреъц (оЬ1<гг) Здесь параметр офес! является объектом, тип которого мы хотим идентифицировать. Ои может иметь любой тип, в том числе встроенный или определенный пользовагелем. Оператор еуре1<т возвращает ссылку иа объект типа суре вплс, описывающий тип обгекта.

Класс куре 1пвс содержит следующие о~крытые функции-члены. | Ьсс1 срегаесг==(сспас Суре 1пГс ЬоЬ); Ьсс1 срегаесг!=(сспас Гуре 1пгс аоЬ); Ьсс1 Ьегсге(сспаг Гуре (пес аоЬ); сепах спаг *пашею г Перегруженные операторы "= " и *'.=" позволяют сравнивать типы. Если вызывак1щий объекз. предшествует объекту, использовапиому как параметр, функция Ьевсге() возвращает значение егае (Чаще всего эта функции применяется лля внутренних целей. Оиа ие имеет никакого отношения к иерархии классов и механизму наследования.) Функция пюхе() возвращает указатель на имя заданного типа. Рассмотрим пример, в котором используется оператор еурезй. /Г Простой пример, в котором мспсльэуетсл оператор Гуре1<(. В(пс1пце <усвегеаа> В(пс1пце <ГурегпГа> цаъпд патеарасе нссг с1аав г>ус1анн1 ( 7/ Часть )!.

Язык С++ с1аяя юус1авя2 ( lг )з 1пг. юа1п() ( Тпе з., 11оае Тз снят *рз пзус1авв1 оЬ1з юус1аяв2 оЬ2; соне « "Тип объекта объз " « суреЫ(оЬТ).паве(); соне « епа1з соне « "Тип объекта оЬ2з ' « суреъб(оЬ2).паве(); соне <с М',и"з 11(суреЫ(1) == СуреЫ(2) ) апис с< 'типы объектов з и 2 аовпадаютхп"з 11(еуреЫ(1) ) = ЕуреЫ(1) ) аопс « "Типы объектов з и 1 не совпадают1п" з 11(еуре1б(оЬ1) (= СуреЫ(оЬ2) ) соне « "Объекты оЬ1 и оЬ2 имеют разные типыхп"з теептп Оз Результаты работы этой программы приведены ниже.

Тип объекта 1з 1пе Тип объекта Тз 11оае Тип объекта рз сиат * Тип объекта оЬ1: с1аяя вус1аяя1 Тип объекта оЬ2: с1аяя зпус1аяя2 Типы объектов 1 и з совпадают Типы объектов 1 и 1 не совпадают Объекты оЬ1 и оЬ2 зпзеют разные типы Самое важное свойство оператора еуреаб проявляется, когда он применяется к указателю на объект базового класса.

В этом случае он автоматически возврашает тип реального объекта, на который ссылается указатель. причем этот объект может быть экземпляром как базового, так и производного классов. (Напомним еще раз: указатель на объект базового класса может ссылаться на обьекты производного класса.) Таким образом, в ходе выполнения программы, используя оператор еуреМ, можно идентифицировать тип объекта, на который ссылается указатель базового класса.

Этот принцип иллзострируется следуюшей программой. Глава 22. Динамическая идентификация типа н операторы приведения соне с< соус « аопс « соне « апис « аопе « "Тип объекта Тз " сс СуреЫ(1).пате(): епб1 з "Тип объекта 1= " <с СуреЫ(1) .пвзпе() з егн11 з "Тип объекта рз " <с Суре1<)(р) .папе() з епб1 з // Пример применения оператора сурезб // к иерархии полиморфных классов. Мзпс1ибе <1оясхеал> Фзпс1иг)е <Еуреьпео> ия1пд палеярасе яебз с1аяя иалла1 риЬ11сз Уфхеиа1 Ьоо1 1ауя еддя() ( кесихп ьа1яе; ) // Класс Налла1 // является полиморфным // ); с1аяя Сае: риЬ11с налзаа1 ( риЬ11с: // ); с1аяя Р1акурияз риЬ11с мазлпа1 риЬ1з.с з Ьоо1 1ауя еддя() ( тесихп ееиез ) // )з 1пс лаги() ( Мапзаа1 *р, Лпуиалша1 з сас сасз Р1асурия р1асурия з р = Ьдпуналла1/ соне « "Указатель р ссылается на объект типа соне « Еурефб(*р).пале() « епб1/ р =- ьсаез соне « "Указатель р ссылается на объект типа соне « Еурезб(*р).пате() « епб1/ р = ар1аеурияз соис « "указатель р ссылается на объект типа соне « еуреъс)(*р).пале() « епб1/ теситп Оз ) Результаты работы этой программы приведены ниже.

| Указатель р ссылается на объект типа с1аяя Налзла1 Указатель р ссылается на объект типа с1аяя Сас Указатель р ссылается на объект типа с1аяя Р1аеурия Итак, если оператор еуре1д применяется к указателю на объект полиморфного базового класса, тип объекта, на который ссылается указатель, можно определить в ходе выполнения программы. В любом случае, если оператор еуре1а применяется к указателю на объект неполиморфного базового класса, возвращается базовый тип указателя. Иначе говоря, невозможно определить, на объект какого типа ссылается этот указатель на самом леле.

Часть й. Язык С++ Закоммснтирусм, например, ключсвсе слово тйтепа1, стоящее перед имсцсм функции 1ауя еопт() в классе мавва1, псрскомпилирусм программу и запустим сс вновь. Указатель р ссьюается на объект тыва с1аяя Матта1 Указатель р ссылается на объект типа с1аяя Матта1 Указатель р ссылается на объект типа с1аяя Матта1 Класс мавва1 больше нс является полиморфным, и каждый объект теперь имеет тип Мюпва1, т.с.

тип указателя р. Поскольку оператор суре16 обычно применяется к разымснованным указателям, слсдуст прсдусмотрсть обработку исключительной ситуации Ьай еурейб, которая может возникнуть, соли указатель будет нулевым. Ссылки на объект полиморфного юзасса аналогичны указателям. Если опсратор суре1а применяется к ссылкс на объскг полиморфпого базового кзасса, он возвращает тип обьскта, на который в дсйствизельносги установлена ссылка, причем этот тип может быть производным классом. Чаше всего этот оператор применяют для проверки параметров, передаваемых функциям с помошью ссылок.

Напрнпсср, в слсдуюшсй программе функция инасматва1() объявляет параметр, являюшийся ссылкой на объект класса мавва1. Это значи~, по функция ппсасмавта1() может получать ссылки на объекты класса матва1, а также любого класса. производного от нсго. Если к этому параметру применяется оператор еурейб, он возврашаст фактический тип передаваемого объекта. // Оператор Сурейб применяется к ссылке. а1пс1пбо «йояпгеапс> Втпс1пбе «Сурейпбо> пяйпд патеярасе ясдс с1аяя Мапппа1 ( рпЫ то уатспа1 Ьоо1 1ауя еддя() ( тегцхп ба1яег ) // класс мапппа1 // является полнморфным с1авя Сап с рпЬ1зс Мапта1 рпЫ)сс // ); с1аяя Р1апурпяс рпЬ11с Матта1 ( рпЫ ).с: Ьоо1 1ауя еддв() ( гесптп сппе; ) // ); // Применение оператора Сурейб к параметру, // передаваемому с помотью ссылки уоаб И?сапиапппа1(натпт1 аоЫ ( оопп « "Объект оЬ имеет тип оопп «Сурехб(оЫ .пате() «епс?1; ) йпс тазп() ( Мавта1 АпуМатта1 г Глава 22.

Динаппическвя идентификация типа и операторы приведения Сае саЫ Р!аеурпа р1асурпа; И)таенакла1(/с уналла1)- ЖЬаснатпа1(сас)т )тбатмалла1(р1асуриа); тесптп О; ) Эта программа выводит па экран следуюшие результаты. т Объект оЬ имеет тип с1авя Иалла1 Объект оЬ имеет тип с1аея Сае Объект оЬ имеет тип с1аая Р1аеуртта Оператор еуреатт имеет вторую форму, получающую в качестве аргумента имя типа. Ес обший вид приведен ниже.

$ сурета(яхы тлнт4 Например, слслуюший оператор совершенно правилен, Я сопл « Суретб(тпе).пале(); Данная форма оператора еуреад позволяет получи~ь объект класса суре 1пео, описываюшии заданный тип. благодаря этому ее можно применять в операторах сравнения типов. Например, следуюшая версия функции иттаемалла1() сообшает, что кошки боятся воды. ттотт) ИЬаеналла1 (Иалла1 ЬоЫ соне « "Параметр оЬ ссьлается на объект типа сопс « Суре(б(оЫ .пален « епс(1; 11[луре)б(оЫ == Суре1т)(Сап)! сопе « "Колки боятся воды.Ж"т ) Применение динамической идентификации типа Мошь механизма динамической идентификации типа иллюстрируется следуюшей программой.

Характеристики

Тип файла
DJVU-файл
Размер
7,03 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6556
Авторов
на СтудИзбе
299
Средний доход
с одного платного файла
Обучение Подробнее