Г. Шилдт - Полный справочник по C++ (1109478), страница 138
Текст из файла (страница 138)
К ним относятся: 1) класс ьаа а11ос, генерирующий исключительную ситуацию при неудачном выполнении оператора пет>; 2) класс ьао еуре1д, генерирующий исключительную ситуацию при неправильном выполнении оператора езззеас(; и 3) класс ьа>з саяе, генерирующий исключительную ситуацию при некорректном динамическом приведении типов. Эти классы состоят из тех же членов, что и класс ехсереасп. В заголовке <ехсереаоп> определены следующие типы. функции, объявленные в заголовке <вхсвре1оо>, перечислег(ы в табл.
3](.!. Таблица 38.1. Функции, определенные в заголовке <ехсерйоп> Назначает функцию, заданную параметром (и, об (и) работчиком неисправимых ошибок Возвращает указатель на старый обработчик этого вида Назначает функцию, заданную параметром бъ об(о) работчиком непредвиденных искпючительныхситуаций. Возвращает указатель на старый обработчик этого вида Вызывает обработчик неперехваченной и нюсправимой ошибки.
По умолчанию вызывает функцию а?юге (] Возвращает значение екав, если исключительная ситуация не была перехвачена Вызывает обработчик непредвиденной исключительной ситуации, если функция сгенерировала непредусмотренную исключительную ситуацию. По умолчанию вызывает функцию свгв1аасв () Св 1. Ев Ь а1 евь Евкмхпаев (Свккалаев Ьатн11вг еьгом() г евгвтлаев Ьасахвг ае р Са( р ЕЕЬ аз~ СЬгам()г ча1г) Свгвзааев(]г Ьаа1 алсаадЬС висврезаа() ° га16 аавярвссвл() г Заголовок <вйехоерт> Исюночительиая ситуавм Выход за пределы допустимого диапазона значений. При вызове функции указан неверный аргумент.
Попытка создать слишком крупный объект. Аргумент функции выходит за пределы допустимого диапазона значений. Еавазо вктаг Злма]1Е агдяввас 1всдеЬ актах аае ос гаядв Исключительнь)е ситуации, перечисленные ниже, являются производными от базового класса гцое1юв вктог. Смысл амвгк1ам вкгаг Переполнение при выполнении врифметическихопераций. Выход за пределы допустимого диапазона. Потеря значимости. гаадв вггак ааавгв1ам актах Глава 38. Обработка исключительных ситуаций и прочие классы В заголовке <еегтвисвре> определены несколько стандартных исклгочитсльных ситуаций, генерируемых библиотечными 4)уг(килями или системой поддержки выполнения программ (гоп-()п)е зугяегп).
В заголовке <еебвисврс> ОнрЕДЕЛЕНЫ Деа ВиДа иС- ключительных ситуации. логические ошибки и ошибки, возникающие при выполнении программ (гамп-((пте епогз). Логические ошибки — результат неправильного программирования. Ошибки, возникающие при выполнении программ, являются следствием неверной работы библиотечных функций или операционной системы и не могут контролироваться программистом. Стандартные исключительные ситуации, порождаемые логическими ошибками, описываются классами, производными от класса 1од].с вггог. ~ Класс аорто рог Класс аиео рсг, объявленный в заголовке <ааа>гу>„весьма интересен. Объект этого класса является указателем, имеющим право владения объектом, на который он ссылается.
Это право можно передать другому объекту класса аисо рсг, однако ~некоторые объекты владеют объекгамн вечно. Эта схема гарантирует правильное уни по- жение динамических объектов при любых обстоятельствах с помощью деструкторов самих объектов, Например, когда один объект класса аисо рет присваивается другому, право владения объекта переходит левому операнду оператора присваивания.
При уничтожении указателей объект, на который они ссылаются, уничтожается лишь один раз, а именно: когда уничтожается указатель, имеющий право владения данным объектом. Одно из преимушеств такого подхода заключается в том, что он позволяет уни пожать динамические объекты в ходе обработки исключительных ситуаций. Шаблонная спецификация класса аиео рег приведена ниже. й сеар1асе <с1аяя т> с1аяя аисо рстг Здесь класс т представляет собой тип указателя, хранящегося в объекте класса аисо рсг. Класс аисо рсг имеет следующие конструкторы. 1 г ехр1зсъе аисо рст(Т* р(г;- О) Е)1тон() г аисо рст(аисо рст сеЬ) сптонО; Сеар1аее <с1аяя Т2> аиео рет(аиео рет<Т2> СаЫ Сеген(); Первый конструктор создает объект класса аисо рсг, ссылающийся на объект, заданный параметром ргг.
Второй конструктор создает копию объекта класса аиео рсг, заданного параметром оЬ, и передает новому объекту право владения. Третий конструктор преобразует объект оЬ в экземпляр класса т (если этой возможно) и передает ему право владения. В классе аиео рег определены операции, * н ->. Кроме того, он содержит две функции-члена.
Т *деСО сопят Сйтоны г т *те1еаяе() сопят сйтон()г Функция вес() возвращает указатель на объект класса т. Функция ге1еава() лишает вызывающий объект класса аисо рех- права собственности и возвращает указа~ель на обьекг класса т. После вызова функции гаъаава() объект класса т, которым владеет объект класса аисо рог, вышедший за пределы видимости, не уничтожается. Рассмотрим программу, демонстрирующую применение класса аисо рег. // демонстрация класса аиео рет. Съпс1ис)е <ъояетеап> Съпс1ис)е <тевюту> ияъпд папеярасе яСС(г съяХ( ри)>11с: х() ( соис « "соялание1п"г ) -Х() ( соие « "уннчтожениехп"г чоъо 1() ( соис « "Внутри ()ункции Е() 1п"г ) гпг ааз.п() ( Часть й(.
Библиотека стандартных классов вито ртт«Х> р1(дев Х), р2» р2 = р1» // Передача града владения р2->1()» // Объекты клаесса аисо рст можно присваивать // обычным указателям. Х *рог = р2.цеСО» рот †>1()» гесцтд 0» ) Результат работы программы показан ниже.
создание Внутри Функции т() Внутри функции д() уничтожение Обратите внимание иа то, что функцию с (), являющуюся членом объекта х, можно вызывать как с помощью объекта класса аиео рот, так и через обычный указатель, возвращаемый функцией оее(). Класс раат. используется для храпения лар объектов, как это происходит в ассоциативном контейнере. Его шаблонная спецификация имеет следующий вил. сел»р1асе <с1авв ксуре, с1авя усуре> ветс»сс ра1г Суре»)ег Ктуре 11гвт Суре; сурес)ет Чтуре весопб суре» Кеуре 11гвт» утуре яесот»д» // Конструкторы ратт(); ра1т(сопят ксуре ай, сопят (»суре су)» Сед»р1ате«с1аяв А, с1авя В> ра1т(сопят<а, В> ао)з)» ) В поле л1тве обычно хранится ключ, а в поле чазов — значение, связанное с этим ключом. В классе раат определены следующие операции: ==, .'=, «, «ч > и >«я Пары можно создавать либо с помощью конструктора класса ратх, либо с помощью фупкции ааХе раат(), которая объединяет свои параметры, Функция в»ахе рахт() является обобщенной.
Ес прототип выглядит следуюгцим образом. тетр1ате «с1авв К»уре, с1аяв Иуре> ратт<К»уре, у»уре> таке ра1г(содвс Коре а/», сопят Итре аю» Как видим, эта функция возвращает пару. состоящую из объектов, имеющих типы Кгуре и )»гуре. Преимушество функции вахе суре() заключается в том, что типы обьектов, из которых образуется пара, определяются компилятором автомати юски, а пс задаются программистом яш»ым образом.
Класс рахт и функция ваХе рахт() используют заголовок <ие111су>. 727 Глава 28. Обработка исключительных ситуаций и прочие классы ';4 Локализация Стандарт языка С++ содержит большую библиотеку классов, предназначенных для локализации программ. Эти классы позволяют приложениям задавать или получать информацию о геополитическом окружении, в котором они выполняются.
Таким образом, они определяют, например, формат представления денежных величин„време~~и и даты, а также порядок их сравг ~ения. Кроме того, эти классы позволяют классифицировать символы. Библиотека локализации использует заголовок <зооаза>. Она оперирует наборами классов, в которых определяются аспекпгы локализации (гасегз)— информация, связанная с локализацией программ. Все аспекпя локализации являются производными от класса 1аоас, который в свою очередь вложен в класс аооаза.
Честно говоря, библиотека локализации крайне велика и сложна. Ее описание выходит за рамки нашей книги. Хотя большинство программистов не применяют библиотек локализации непосредственно, тот специалист, который занимается международными проектами, должен внимательно изучить ее особенности. ~~ Прочие классы В стандартной библиотеке языка С++ определены еще несколько довольно интересных классов.
Описание сура заев используется в сочетании с оператором курага, описанным в главе 22. Использует заголовок <еуракяео>. аояма>о 1амаьа Инкапсулирует пределы изменения чисел. Использует заголовок < 1 Зззк Е а >. кан аеокада деакаеок Инкапсулирует средства распределения неинициализированной памяти. Иаюпьзует заголовок <иаиокзг>. Часть |Ч.
Библиотека стандартных классов Полный справочник по 1,$ Прияжения на.языке С+ ) В этой части книги рассматриваютсв два простых приложенил. Преследуется двовкав цель: во-первых, приведенные примеры иллюстрируют преимущества объектно-ориентированного программирования„а вовторых, они демонстрируют, как с помощью взыка С++ можно решить две совершенно разные задачи.
Полный спр авочник по Ф ! Ф ИЙтеГрацйя нОВцх иассОВ: пмыоватмьсйй,,йасс для работы со строайи этой главе описывается процесс разработки и реализации небольшого класса, 8 обеспечивающего работу со строками. Как известно, стандарт языка С++ солсржит полноценный моц(ный класс лля работы со строками под названием )завз.о ветъпя. Цель этой главы заключается не в разработке альтернативного класса. Э На конкретном примере мы стремимся дать читателю ясное представление о разработке и интеграции новых типов данных.
Создание класса для работы со строками является весьма ярким примером. В прошлом многие программисты опачивали мастерство, создавая свои собственные строковые классы. В этой главе мы займелюя тем же, Хотя класс, ко~орый мы будем разрабатывать, намного проще стандартного, у нас булет олно преимущество: мы с самого начала можем полностью контролировать процессег)еализации строки и манипуляции ими. В некоторых ситуациях это может оказаться полезным. В конце концов, эзо просто интересно! ~~~ Класс 81гТуре Наш класс намного проще стандартного. Разумеется, он не настолько велик и сложен. Перечислим требования, которым должен соответствовать наш класс. ° Строки должны присваиваться с помощью оператора присваивания. ° Строковым объектам необходимо присваивать как строковые объекты, так и строки, заключенные в кавычки.