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

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

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

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

Функция дасеоху() создает объекты различных классов, производных от класса маяяяа1. (Функции, создающие объекты, иногда называются ((/абрахами обьехлтов (об)ес( Гас(огу).) Конкретный тип созлаваемого объекта задается функцией таптт(), которая прелставляет собой генератор случаиных чисел в языке С++.

Таким образом, тип создаваемо~о объекта заранее не известен. Программа создаст !О объектов и подсчитывает количество объектов каждого типа. Поскольку все объекты генерируются функцией деспоту(), для идентификации фактического типа объекта используется оператор еуре1д. // демонстрация динамической идентификации типа. а1пс1пт)е <тоаетеал> ивъпя палеярасе яса; с1 тяе Малий1 ( рпбтзс ттвлспа1 Ьоо1 1ауа ессв() ( тесптп та1ает ) // Класс Иалла1 /! является полиморфным Часть (!. Язык С++ с1авв Сагз рПЬ11с Иаптпа1 ( рпЬ1зсз // ); с1авв Р1агуривз риЬ11с Иапапа1 ( риЬ1зс: Ьоо1 1аув еядв() ( гехихп Ггпез ) // )з с1авв роуз р1зЬ11с Иатзза1 ( рчЬ11сз // )з // Фабрика объектов, производиык от класса Иатаа1. Иапва1 *хасгоху() ( выахсЬ(гвлб() Ъ 3 ) ( саве О: гехпхп пеы Оояз саве 1з гегпгп пои Сах) саве 2: гегихп псы Р1ахуривз хегпхп Оз з.пт.

звазп() ( Иаплза1 "рхгз // указатель иа базовый класс. 1пг Рз зпб с=О, б=О, р=О; // Создаем и подсчитываем обьекты. бог(1-=Оз з<10; з++) ( рхх = гасгоху()з // Создаем объект. сопл « "Тип объекта." " « Гуре1б(*рог).пазве() соьг « егн)1з // Подсчет 11(суреЫ(*рхг) "— — гуреЫ(Бед) ) б++; аг(хуреаб(*рхх) == ГуреЫ(Сах) ) с++з 12(хуреЫ(*рхг) == ГуреЫ(Р1ахурпв) ) р++; хехпгп Оз Глава 22. Динамическая идентификация типа и оператары приведения сепг « сонг « сопл « соил « соззх « епб1 з "Созданные животиыез 1п"з Собаки: " « б « епб1з Ковкиз " « с « епб1; Уткоиосыз " « р « епс)1) Результаты работы этой программы приведены ниже.

Созданные животные: Собаки: 2 Коики: 4 Утконосы: 4 Применение оператора $уреЫ к шаблонным классам Оператор еуре1б можно применять к шаблонным классам. Тип объекта, являющегося объектом шаблонного класса, определяется, в частности, тем, какие данные используются в качестве обобщенных при создании конкретного объекта. Если при создании двух экземпляров шаблонного класса используются данные разных типов, считается, что зги объекты имеют разные типы.

Рассмотрим простои пример. // Применение оператора Сурезд к ааблонам. 41пс1ибе <Тояегешп> ияхсд сатеврасе всб; сеюр1асе <с1аяя т> с1авв юус1авв Т а; риЬ11с: юус1авв(Т 1) ( а - "1; ) // ); 1сс паза() юус1аяв<зпе> о1 (10), о2 (9); юус1авя<бои)>1е> оз (7. 2); соие « "Объект о1 имеет тип соне « Сурезб(о1).паве() « есб1; соне « "Объект о2 имеет вид соис « сурета(о2).саве() « есб1; соис « "Объект оЗ имеет вид соис « суреЫ(оЗ).саюе() « есб1; соис « есб1; 11(еурезд(о1) == Еуре1б[о2) ) соие « "Объекты о1 и о2 имеют одинаковые типы1с' [ 11[суретб(о1) == СуреЫ (оЗ)) соне « "Оаибка1п"; е1ве соне « "Объекты о1 и оз имеют разные типы1п"; Часть И.

Язык С++ 'Гип объекта: тис объекта: Тип объекта: Тип объекта: Тис объекта: Тип объекта: Тип объекта: Тип объекта: Тип объекта: Тип объекта: с1аяя с1аяя с1аяя с1авв с1авв с1аяя с1авя с1авв с1авв с1аяв Р1аеурив Р1асурив Сап Сас Р1аеурив Сап Рос Роя Сае Р1аеурив Результаты работы этой программы приведены ниже. Объект о1 имеет тип о1евз муо1езв<ьпс> Объект о2 имеет тип с1азз юус1азз<Ые> Объект оЗ имеет тип о1азз мус1езз<баиЬ1е> Объекть; о1 и о2 имеют разные типы Объекты о1 и оЗ имеют разные типы Как видим, котя два объекта представляют собой экземпляргя одного и того жс шаблонно~о класса, если параметры не совпадают, их типы считаются разными. В данной программе объект ох имеет тип тус1авв<хюс>, а объект оз — аус1авв<асмь1е>. Таким образом, их типы не совпадают.

Динамическая илснтификация типов применяется нс во всех программах. Однако при работе с полиморфнылчи типами механизм' КТТ! позволяет распознавать типы объектов в любых ситуациях. ''4 Операторы приведения типов В языке С++ существуют пять операторов приведения типов. Первый оператор является вполне традиционным и унаследован от языка С. Остальные четыре были добавлены впоследствии. К ним относятся операторы гчуааахс саве, сосне саве„ ке5хгсегркее саве и веасдс санс. Зги операторы позволяют полнее контролировать процессы приведения типов.

.""" 1 Оператор бупаппс сав$ Пожалуй, наиболее важным из перечисленных новшеств является оператор гтупавйс саве, осущссгвляющии динамическое приведение типа с последующей проверкой корректности приведения. Если приведение оказалось некорректным, оно не выполняется. Общий вид оператора ггуаам3.с саве таков. й гчупаю1с сазе <гпгхы Оре> [ехрВ ч Злесь параметр гагуеГ гуре задает результирующий тип, а параметр ехдг — выражение, которое приводится к новому типу. Результирующий тип должен быль указательным или ссылочным, а приводимое выражение — вычислять указатель или ссылку.

Таким образом, оператор гтупвахс санс МОжнО ПрИМСНять Дпя Прнведсиня тиПОв укаэателей илн ССЫЛОК. Оператор гтупавхс саве предназначен для приведения полиморфных ~иное. Допустим, даны два полиморфных класса в и п, причем класс и является производным от класса в. Тогда оператор сухмсвьс саве может привести указатель типа и" к типу в*. Это возможно благодаря тому, что указатель на объек~ базового класса может ссыяаться на объект производного класса. Однако обратное динамическое приведение указателя типа и* к типу в* возможно лишь в том случае, если указатель действительно ссылается на объек~ класса и. Оператор гтуааадс саве достигае~ цели, если указатель или ссылка, подлежавшие приведению, ссылаются на объект результирующего класса или объект класса, производного от результирующего.

В противном случае приведение типов считается неудавшимся. В случае неудачи Глава 22. Динамическая идентификация типа н операторы приведения оператор аупвш1с саве, примененный к указателям, возвращает нулевои указатель. Если оператор дупаш1с саве применяется к ссылкам, в случае ошибки генерируется исключительная ситуация Ьа() саве.

Рассмотрим простой пример. Допустим, что класс Вазе является полиморфным, а пвгатвд — производным от него. Вазе Ьр, Ь оЬ; Пегасе() *г)р, г) оЬ; Приведение указателя Ьр, имеющего базовый тип, к указателю ар, имеющему производный тип, выполняется успешно, поскольку указатель Ьр на самом деле ссылается на объект класса пвг1теа. Таким образом, этот фрагмент выводит на экран сообщение "приведение выполнено успешно". Однако в следующем фрагменте приведение не выполняется, потому что указатель ьр ссылается на объект класса Вазе, а приведение базового объекта к производному невозможно. Поскольку приведение невозможно, фрагмент выводит на экран сообщение "Приведение не выполнившее .

Следующая программа демонстрирует разные ситуации, в которых выполняется оператор оутиайс саас. Часть )!. Язык С++ 1 Ьр = ад оЬ; // указатель базового типа ссылается на объект // производного класса. г)р = бупашьс сазс<оег1гед *> (Ьр); !/ Приведение указателя // производногс типа выполнено успешно. 1В(бр) сопс « "Приведение выполнено успешно Ьр = аЬ оЬ; /! указатель базового типа ссылается на объек~ // класса Вазе. др = г)упашьс саве<регьгеб *> (Ьр); // Ошибка ьб[!др) соил « "Приведение не выполняется"; // демонстрация оператора г)упаш1с саве. аьпс1пбе <Вовегеаш> ивьпд пашеврасе все; с1азз Вазе ( рцЬ1з.с: гьггаа1 го1г) 1() ( соос « "Внутри класса Вавехп"; !/ ); с1азв оегтвеб .

"риЬ11с Вазе ( рпЬ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п" « "ссыпается на объект класса Вазе.М"; Глава 22. Дннаиичеокав идентификацив типа и операторы прнведеню сспе « епй1; йр =- ай оЬ," // указатель йр ссылается на объект класса Рехзчей Ьр = йупашьс свес<Вазе "> (йр); 11(Ьр) ( сспс « "Приведение указателя йр к типу Вазе « "выполнено успешно.М'; Ьр->1(); ) е1ве соис « "Ошибкатп"г геепкп О,- ) Результаты работы этой программы приведены ниже.

Приведение типа Рек1чей * к типу Рел1чей * выполнено успешно. Внутри класса Рекьчей Приведение типа Регьчей * к типу Вазе * выполнено успешно. Внутри класса Рекьчей Приведение типа Вазе * к типу Вазе ' выполнено успешно. Внутри класса Вазе Приведение типа Вазе * к типу Рекьчей * невозможно. Приведение указателя Ър к классу Регзчей " выполнено успешно, поскольку указатель Ьр действительно ссылается на объект класса Ретзчей Внутри класса Рекзчей Теперь приведение указателя Ьр к типу Рекьчей невозможно, так как указатель Ьр на самом деле ссылается на объект класса Вазе. Приведение указателя йр к классу Вазе * выполнено успешно. Внутри класса Рекьчей Замена оператора 1уреЫ оператором бупа)п1с сай Иногда оператор йупаяйс саве можно использовать вместо оператора еуреьй. Допустим, что класс Вазе яаяяс(ся полиморфным, а Рек1чей — произв(оным от него.

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

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

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

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