Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 56
Текст из файла (страница 56)
Пользоваться этой возможностью следует с величайшей осторожностью. 3. Оператор атанас еав$, по существу, предназначен для замены прежнего оператора приведения типов. Он просто выполняет операцию приведения типов над объектами неполиморфных классов. Например, в следующей программе тип ()оа1 приводится к типу 1пт. // Пример использования оператора атаСьс сааб Ььпс1ис)е <ъоветеата~ пвьпд паптеарасе вЫ; пп таъп () ( (ттт 1; йоат К; 199.22; 1 = втат)с сает<)пг> (Х) ) Глава 12. Динамическая идентификация и приведение типов сопт « 1; тетитп 0; 1.
Объясните, зачем нужны операторы сома еаа$, гешМгрге1 сваг и вгаГ(е еав1. 2. В следующей программе имеется ошибка. Исправьте ее с помощью оператора соввГ саа$. ((ьпс1п<(е <ьое<сеета> пв(пе патеврасе в1д; чоЫ Г (сопит ооио)е аз.) ( 100; // Ошибка! Исправьте ее с помошью оператора сопвс савс (п1 ткахп () ( доиЫе х = 98.6; сои1 « х « епс11р Г (х); соит « х « епд1; тстптп 0„ 3. Объясните, почему оператор сопа1 еав( следует использовать только в самых крайних случаях.
Теперь вам необходимо выполнить следующие упражнения и ответить на вопросы. 1. Опишите операции, которые можно выполнить с помощью оператора $уреЫ. 2. Какой заголовок нужно включить в вашу программу для использования оператора 1уреЫ? Самоучитель С++ 3. Помимо стандартного приведения типов, в С++ определено для этой цели еще четыре оператора. Что это за операторы и зачем они нужны? 4. Допишите следующую программу, чтобы на экран выводилась информация о выбранном пользователем типе объекта. ((тпс1пс(е <1оястеат> Йгпс1ибе <(.урегп1о> пятпд папеярасе япс(; с1аяя А ( г1тбпа1 чотс( Х() с1аяя В: рпб11с А ( с1аяя О: рпЫъс В 1пп п~аъп() ( А *р, а оЬ; в Ь оЬ| С с оЬ; тпп сопс « "Введите О для обьектов типа А, "; соил « "1 для объектов типа В итл"; сопя « "2 для объектов тига С.~п"; съп>> 1 11 (1-=1> р = 6Ь оЬ; е1яе 11 (1=-=2) р = ас оЬ; е1яе р = га оЬ! выведите на экран сообщение о тиге // выбранного пользователем объекта ге(.пгп О; 5.
Объясните, каким образом оператор ~уреИ можно иногда заменить оператором Йувапис сав1. 6. Тип какого объекта можно определить с помошью оператора 1уреЫ? Глава 12.Динамическая идентификация и приведение типов В этом разделе проверяется, хорошо ли вы усвоили материал этой и предыдущих глав. 1. Переделайте программу из раздела 12.1, пример 4, чтобы возможную ошибку выделения памяти внутри функции аепега1ого отслеживать с помощью механизма обработки исключительных ситуаций. 2.
Измените функцию яевега1ог() из вопроса 1, чтобы в ней использовать версию оператора пев с ключевым словом пойгов. 3. Особо сложное задание: попытайтесь создать иерархию классов с абстрактным классом Ва$аЯгие$ на ее вершине. В основании иерархии создайте два производных класса. В одном должен быть реализован стек, в другом — очередь. Создайте также функцию РаФайтцс1Рас1огуО со следующим прототипом: РагаЯтосг +Раеаветис~Хасессу (сЬас метха1 Функция Ра1аБ(тпс1Рае1огуО должна создавать стек, если параметр метка равен з, и очередь, если параметр метка равен г1.
Возвращаемым значением функции должен быть указатель на созданный объект. Покажите, что ваша "фабрика объектов" работает. Глава 13 Пространства имен и другие темы В этой главе рассказывается о пространствах имен (пагпезрасез), функциях преобразования (сопче)в(оп (цпс((опз), статических (з(а1(с) и постоянньгх (сопв() членах класса, а также о других необычных инструментах С++. Перед тем как продолжить, необходимо правильно ответить на следующие вопросы и сделать упражнения.
1. Что собой представляют новые операторы приведения типов и для чего они используются? 2. Что собой представляет класс $уре 1пГо? 3. С помощью какого оператора определяют тип объекта? 4. Дан следующий фрагмент программы. Покажите, как определить, объектом какого типа является указатель р: объектом типа Ваве или объектом типа Вепчед. с1ава Вале ч(гтиа1 чоЫ й() () )) става Оегтчес): рыЬ1тс Ване тпс показ.п () ( Базе "р, Ь оЬ; пегтчес) с1 оЬ; 5. Оператор ф)вава сав1 успешно завершается только в том случае, если объект, над которым выполняется операция приведения типов, является Самоучитель С, + либо объектом целевого типа, либо объектом целевого типа. (Вставьте нужное слово.) 6. Можно ли с помощью оператора фпапнс саМ снять атрибут сопя(? от 1 3.1.
Пространства имен пап~еврасе кмис Г // обълвленюг 1 О пространствах имен коротко было рассказано в главе 1, сейчас мы рассмотрим это понятие более подробно. Пространства имен появились в С++ относительно недавно. Они предназначены для локализации имен идентификаторов во избежание конфликтов имен (пате со111з1опз). В среде программирования С++ сосуществует невероятное количество имен переменных, функций и классов. До введения понятия пространств имен все эти имена находились в одном глобальном пространстве имен и возникало множество конфликтов. Например, если вы в своей программе определяли функцию 1оиррег(), то она могла бы (в зависимости от списка своих параметров) подменить стандартную библиотечную функцию 1опррвг(), поскольку имена обеих функций хранились бы в одном глобальном пространстве имен. Конфликты имен имеют место, когда в одной и той же программе используются библиотеки функций и классов разных производителей.
В этом случае вполне возможно — и даже очень вероятно, — что имена, определенные в одной библиотеке, будут конфликтовать с теми же именами, но определенными в другой библиотеке. Все проблемы решило введение понятия пространств имен и ключевого слова пап~еьрасе. Это ключевое слово позволяет локализовать область видимости имен, объявленных в данном пространстве имен. Пространство имен дает возможность использовать одно и то же имя в разных контекстах и при этом почвы для конфликтов не возникает. Вероятно, больше всего выиграла от введения пространств имен стандартная библиотека С++ (С++ згапдап) 11Ьгагу). В ранних версиях языка вся библиотека С++ определялась в глобальном пространстве имен. Теперь библиотека С++ определяется в собственном пространстве имен я1Й, что значительно снижает вероятность конфликтов имен. Вы также можете создавать в программе свои собственные пространства имен, чтобы локализовать область видимости тех имен, которые, по вашему мнению, могли бы вызывать конфликты.
Это особенно важно при создании собственных библиотек классов или функций. Ключевое слово патеярасе путем объявления именованных областей дает возможность разделить глобальное пространство имен. По существу, пространство имен определяет область видимости. Ниже приведена основная форма использования ключевого слова павезрасе: Глава 13, Пространства имен идругие темы 355 Все, что определено внутри инструкции вап)еврасе, находится внутри облас- ти видимости данного пространства имен.
Ниже приведен пример объявления пространства имен Муаран)еЯрасе: яятпеярясе Иувавеярасе ( тй чо).а п~угосс (1п~ 1' ) ( совс << 1; ) с1аяя пус1яяя ( рс)о11с: ъ.оЫ яес). (1сС х) ( Г =- х; ггс дегъ() ( =есств г; Здесь имена переменных 1 и )(, функции гву1впсО, а также класса п)уе1авв находятся в области видимости, определенной пространством имен МуХа)веБрасе.
К идентификаторам, объявленным в пространстве имен, внутри этого пространства можно обращаться напрямую. Например, в пространстве имен Муаран)еЯрасе в инструкции гв$вгп 1 переменная 1 указана явно. Однако поскольку ключевое слово вап)еврасе определяет некоторую область видимости„то при обрашении извне пространства имен к объектам, объявленным внутри этого пространства, следует указывать оператор расширения области видимости. Например, чтобы присвоить значение 10 переменной ) в той части программы, которая не входит в пространство имен Му)Х)ап)еЯрасе, необходимо использовать следующую инструкцию: Мунапеврасе:: 5.
= 10; А чтобы объявить объект типа шус1авв в той части программы, которая не входит в пространство имен Му)Мав)еЯрасе, нужна такая инструкция: (чунатеврасе::тус1авв оЬ; Таким образом, для доступа к члену пространства имен извне этого пространства перед именем члена следует указать имя пространства имен с оператором расширения области видимости. Можно себе вообразить, что если в вашей программе обращения к членам пространства имен происходят достаточно часто, необходимость каждый раз указывать имя пространства имен и оператор расширения области видимости может быстро надоесть.
Для решения этой проблемы была разработана инструкция вв1вя. У этой инструкции имеются две основные формы: ееыщ папеврасе имву свз.пд имя; . члеи; 386 Самоучитель С++ В первой форме параметр имя задает имя пространства имен, доступ к которому вы хотите получить. При использовании этой формы инструкции ця1пя все члены, определенные в указанном пространстве имен, становятся доступными в текущем пространстве имен и с ними можно работать напрямую, без необходимости каждый раз указывать имя пространства и оператор расширения области видимости. При использовании второй формы инструкции вявя видимым делается только указанный в инструкции член пространства имен. Например, пусть у нас имеется описанное выше пространство имен Му1МатеБрасе, тогда правильны все представленные ниже инструкции ияпЫ и операторы присваивания: пегими Мунаткеврасе::к; УУ видимой, делается только переменная — 10; // инструкпия правильна, поскольку переменная к видима пв1пд пажеврасе Мунаюеьрасе; // видимыми делаются все члены пространства имен Мунатеэрасе 10; // инструкпия правильна, поскольку видимы все нленн пространства имен МунапеЯрасе Имеется возможность объявить более одного пространства имен с одним и тем же именем.
Это позволяет разделить пространство имен на несколько файлов или даже разделить пространство имен внутри одного файла. Рассмотрим следующий пример: пашеьрасе пЯ ( 1пъ а~ патпеарасе ХЯ ( тпг 3' Здесь пространство имен ХЯ разделено на две части. Несмотря на это, содержимое каждой части по-прежнему остается в одном и том же пространстве имен — пространстве МЯ.