Главная » Просмотр файлов » А.В. Столяров - Введение в язык Си++

А.В. Столяров - Введение в язык Си++ (1114949), страница 23

Файл №1114949 А.В. Столяров - Введение в язык Си++ (А.В. Столяров - Введение в язык Си++) 23 страницаА.В. Столяров - Введение в язык Си++ (1114949) страница 232019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

Ясно, что множество частных случаев представ­ляет собой подмножество множества случаев общих. Получается, что втерминах множеств наследование описывается отношением включения(A D Б). Естественным следствием такого рассмотрения является тер­мин подкласс (англ, subclass) для обозначения порождённого класса итермин надкласс или суперкласс (англ, su p e rclass) — для обозначе­ния базового.Такая терминология часто порождает определённую путаницу. Делотут в том, что объект порождённого класса ( подкласса ) мало того, чтопамяти занимает заведомо не меньше (а при добавлении новых полей —и больше), нежели объект класса базового ( суперкласса ), но ещё и содер­ж и т в себе о б ъ е к т базового класса, т.

е. объект суперкласса оказывает­ся п о д об ъекто м объекта подкласса. Получается, что мы рассматриваемодновременно два отношения вложенности, причём они мало того чторазные, они оказываются направлены п р о т и в о п о л о ж н о : объект базово­106го класса вложен в объект порождённого класса (чисто технически), авот сами классы «вложены», наоборот, порождённый в базовый.Вся эта путаница обусловлена исключительно применением двух раз­ных терминологических систем в одном месте. Когда речь идёт о суперк­лассах и подклассах — это значит, что используется теоретико-множест­венная терминология. Когда же речь заходит об используемой памяти иподобъектах — очевидно, что разговор идёт в терминах реализаторской(прагматичной) точки зрения.

Так или иначе, обе терминологические си­стемы используются и имеют право на существование; вы на практикеможете столкнуться как с одним вариантом терминологии, так и с дру­гим, а в некоторых случаях — и с их смешением, как в вышеприведённомпримере. Поэтому желательно понимать, что означают термины обеихсистем.§4.12. О перации п ри вед ен и я ти п аВ процессе программирования часто приходится изменять тип выра­жения. Иногда это делается неявно, как, например, в случае сложенияцелочисленного значения со значением дробным (с плавающей точкой).В иных случаях (как, например, при изменении типа указателя) прихо­дится явно указывать компилятору новый тип выражения.В языке Си это делалось с помощью операции преобразованият и п а , записываемой как унарная операция, символ которой есть имятипа, заключенное в круглые скобки, как, например, в следующем вы­ражении:char *р = (ch ar*)m allo c(100);Здесь значение выражения malloc (100), имеющее тип void *, приводитсяк типу char*.Операция приведения типа оп асна в том смысле, что её применениепозволяет при желании обойти любые ограничения, вводимые системойтипизации, включая, например, запреты на запись в константные обла­сти памяти и даже защиту данных в классах.

Необдуманное применениепреобразования типов приводит к запутыванию программы и, в конеч­ном счёте, к трудно выявляемым ошибкам.Для снижения негативного эффекта операции приведения типов, атакже для поддержки полиморфного программирования в языке С и + +вводятся четыре дополнительные операции, предназначенные для пре­образования типа выражения.

Эти операции имеют достаточно нетриви­альный синтаксис: сначала записывается ключевое слово, задающее опе­рацию (s ta tic _ c a s t, dynamic_cast, con st_cast или re in te rp re t_ c a st),затем в угловых скобках ставится имя нового типа и, наконец, в круглых107скобках записывается само выражение, тип которого необходимо изме­нить, например:Square *sp = s ta tic _ c a st< S q u a r e *> (sc e n e [i]) ;В отличие от операции приведения типов в языке Си, которая приме­нялась для всех случаев смены типа, каждая из операций С и + + пред­назначена для своего случая.

Так, операция con st_cast позволяет снятьили, наоборот, установить сколько угодно модификаторов const6; попыт­ка сделать с её помощью любое другое изменение типа вызовет ошибкупри компиляции:in t * р ;const in t *q ;const char * s ;// ...q = p; / / можно без преобразованияp = q; / / ошибка! снятие constp = c o n st_ c a st< in t*> (q ); / / правильноp = c o n st_ c a st< in t*> (s) ; / / ошибка!Отметим, что наличие в языке операции co n st_cast не отменяет опасно­сти такого преобразования. Реальная потребность в обходе константнойзащиты возникает крайне редко; прежде чем применять преобразова­ние, подумайте, всё ли вы правильно делаете, не забыли ли вы, напри­мер, пометить словом const функцию-метод, не изменяющую состояниеобъекта, и т. п.

Д л я применения операции co n st_cast необходимыочень веские причины, и сакрам ентальное «б ез неё не рабо тает»такой причиной не является. В некоторых программистских коллек­тивах на каждое применение co n st_cast необходимо личное разрешениеруководителя разработки.Операция s t a t ic _ c a s t предназначена для работы с наследуемымиобъектами и позволяет преобразовать указатель или ссылку в направле­нии, противоположном закону полиморфизма, т.

е. от базового класса кпорождённому. Попытка произвести любое другое преобразование вызо­вет ошибку. Приведём примеры:c la s s А { / * . . . * / } ;c la s s В pu blic А { / * .. .. * / } ;c la s s С { / * . . . * / } ;А *ар: »В *Ър:»С *ср: »6Также эта операция работает с модификатором v o la tile , который мы в нашемкурсе не рассматриваем.108//арЪрbpср...= bp; / / можно без преобразования= а р ; / / ошибка!= sta tic _ c a s t< B *> (а р ); / / допустимо= s ta tic _ c a s t< C *> (а р ); / / ошибка!Отметим, что делать это следует только в том случае, если мы действи­тельно уверены, что по данному адресу расположен объект именно тоготипа, к которому мы намерены преобразовывать; иное в большинствеслучаев приведёт к аварии.Операция r e in te rp re t_ c a st позволяет произвести любое преобразо­вание (чего угодно во что угодно), если только компилятор понимает, какэто сделать (в частности, преобразовать объекты структур разных типовдруг к другу не получится, поскольку непонятно, как такое преобразо­вание производить).

Фактически эта операция эквивалентна операцииязыка Си, которая обозначается именем типа, взятым в круглые скобки.Рекомендуется, однако, применять именно r e in te rp re t_ c a st, а не опе­рацию Си, поскольку такие преобразования требуют особого внимания, авыражение с использованием re in te rp re t_ c a st лучше заметно в текстепрограммы, чем имя типа в скобках.Несколько особое место занимает операция dynamic_cast. Три опе­рации, которые мы рассмотрели выше, служат для управления системойконтроля типов, т. е. для управления компилятором, и не порождаютдействий, осуществляемых во время исполнения программы7.

Операцияdynamic_cast, в отличие от остальных, предполагает проведение нетри­виальной проверки во время исполнения программы. Подобно операцииs t a t ic _ c a s t , операция dynamic_cast предназначена для преобразованияадресов объектов в направлении, противоположном закону полиморфиз­ма, т. е. от адреса предка к адресу потомка. В случае со s t a t ic _ c a s t от­ветственность за корректность такой операции возлагается на програм­миста: именно программист тем или иным способом должен проверить,что преобразуемый адрес (будь то указатель или ссылка) указывает наобъект нужного типа. Если же применить dynamic_cast, то она сама про­ведёт необходимую проверку и в случае, если преобразование некоррект­но (то есть по заданному адресу в памяти не находится объект нужноготипа), вернёт нулевой указатель.

Проверка, таким образом, осуществля­ется во время исполнения, т. е. динамически, отсюда название операции.Проверка типа производится на основании значения указателя на таб­лицу виртуальных функций; дело в том, что такая таблица уникальна7Кроме преобразования между целыми числами и числами с плавающей точкой,что требует неких действий; иногда бывает необходимо изменить и численное значениеуказателя, но в нашем курсе не рассматриваются механизмы, порождающие такуюнеобходимость.109для каждого класса, имеющего виртуальные методы, т.

е. её адрес од­нозначно идентифицирует класс объекта. Таким образом, dynamic_castможет работать только с классами (или структурами), имеющими вир­туальные функции. В некоторых источниках такие классы называют по­лиморф ными, что не совсем корректно: как мы видели, полиморфизм вопределённом смысле работает и для классов, не имеющих виртуальныхфункций.Отметим ещё один немаловажный момент.

Обычно реализацииdynamic_cast весьма неэффективны по времени исполнения, т. е. рабо­тают очень медленно. Поэтому злоупотреблять ими не следует.§4.13. Е щ ё о п реобразован и и типов вобработчи ках исклю ченийПри обсуждении преобразований типов выражений в обрабочиках ис­ключительных ситуаций (см. стр. 84) мы отметили, что одним из наи­более важных видов преобразования является преобразование по законуполиморфизма, однако подробное обсуждение этого отложили, посколь­ку на тот момент ещё не было введено наследование.Возвращаясь к этому вопросу, заметим, что третий и последний виддопустимых преобразований от типа выражения в операторе throw к ти­пу, указанному в заголовке catch — это преобразование адреса (т.е.

ука­зателя или ссылки) объекта-потомка к соответствующему адресному ти­пу объекта-предка. Таким образом, если мы опишем два класса, причёмодин унаследуем от другого:c la s s А { / * . . . * / } ;c la s s В : pu blic А { / * . . . * / } ;то обработчик видаcatch(const А& ex) { / * . . . * / }сможет обрабатывать исключения обоих типов, т.

е. результат как опе­ратора throw А( . . . ) ;, так и throw В( . . . ) ; .Это свойство используется для создания иерархий исключительныхситуаций. Например, мы можем поделить все ошибки, возникающие вкакой-либо программе или библиотеке, на следующие категории:• ошибки, возникающие по вине пользователя:— синтаксические ошибки при вводе (например, буквы там, гдеожидается число);— неправильно указано имя файла;110— неправильно введённый пароль;— недопустимая комбинация требований (например, одновремен­ное требование упорядочивания по возрастанию и по убыва­нию);• ошибки, обусловленные средой выполнения:— переполнение диска;— отсутствие файлов, необходимых для работы;— прочие ошибки операций ввода-вывода;— недостаток оперативной памяти;— ошибки при работе с сетью;— и т.

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

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

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

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