Г. Шилтд - Самоучитель C++ (DJVU) (1114955), страница 85
Текст из файла (страница 85)
// Здесь показан родовой стек для хранения пар значений ()1пс1Ые <1оя~кеал> пяйпд пал1еярасе япс[; ГЫеЕЕпе 812Е 10 Создание родового класса для стека Еелр1а е <с1аяя ЯсасКТуре> с1аяя ягаск бЗ? Приложение В. Ответы ыа вопросы и решении упражнений Я~аскТуре з~сК(Я1ЕЕ] (2]; // содержит стек Тпрр соя; индекс вершины стека рпЬ11с: чойс) 1п1~() ( соя = 0:] чо1с) ризЬ (Ят.асМТуре оЬ, Якас)<Туре оЬ2) ( яьас)<туре рор (Якас)<Туре аоЬ2); )' Размещение объектов в стеке Сешр1але <с1аяя Ялас)<Туре> соус) власам<Ялас1Туре>:: рцвЬ (Я1ас)~ТуреоЬ, ЯСас)<Туре оЬ2) Тй (~оз==Я1ЯЕ) соцб « "Стек полон1п"~ геснтп; вЬс)<(яоз] (О] = оЬр з1с1(Соз] (1] = оЬ2; ~оз++; Выталкивание объектов из стека Сешр1аяе <с1аяя Ясас)<Туре> ясас)<туре зсас)«якас)сТуре>:: рор (ясасктуре аоЬ2) ( 1й (сов==0) ( соня « "Стек пуст~п"; гекцтп 0; // возврат нуля при пустом стеке соя--р оЬ2 = зТсМ(Ьоз] (1]; тесцтп ябс)<(Соя2 (О]; Тпс ша1п () ( Демонстрация символьных стеков я ас)«сЬат> з), я2; // создание двух стеков 1пс 1; сЬат сП| Инициализация стеков з1.
1п1т. ( ); з2.1пйс(); з1 . рпзЬ ( ' а ', ' Ь ' ) з2.рцзЬ('х', 'к') з1.рпзЬ('Ь', 'б'); Сзмаучигелв 'з') т 'а'); 'х'); з2.роза( з1.роз(т( з2.роз)т( 1<З) 1++) й « !Из стека 1:" « з1.рор(с)т)г сс ' ' сс с)т « "~в"; гог(1=ОЙ соцс сонг. 1<З; 1++) « ")Ь стека 2:" « з2.рор[сЛ): « ' ' «с)т« "М"; ~от(1=0; соек сои'с Демонстрация стеков со значениями тина ЙоцЫе звас1<доцЬ1е> с(з1, <(з2) // создание двух стеков бопЫе с(; П Инициагизация стеков с(з1. 1г!1Е( ); с)з2.1п1с(); с(з1.риз)т(1.1, 2.0); бз2.риз)т(2.2, З,О)! г(з1.роз)г(З.З! 4.0)( бз2.роз)з(4,4, 5.0)у г(з1.риз)г(5.5, 6.0) ) !1з2.рвзп(6.6, 7.0); !.ог(1=Ох 1<3; 1++) соцп « "(Ь стека 1:" « с(з1.
рор (б); сопС <с ' ' « с( с< "~в"; аког(1=0; 1<З, 1++) ( сопс с< "(Ь стека 2:" « с(з2.рор(с)); соцп <с ' ' с< б « "1п"~ гегигп 04 тгу ( // блок ггу е)ггои иози~ смйуагзюч 3 сассн (СЛэе ЗзУ) // ) 5. Ниже представлены обычные формы инструкций 1гу, еа1сй и Фготг: Приложение В. Ответы на вопросы и решения упражнений ВЗЗ б. /* В этой программе показан родовой класс я(асК, в который встроена обработка исключительных ситуаций Ф! сгьпс1пс(е <1оясгеатп> цятгд пагвезрасе зсс(; ()с(еИпе 31ЕЕ 10 Создание родового класса ясас)< гепр1а е <с1аяя ЯсасКтуре> с1аяя ясас)< ЯвасКТуре я1сК [31ЕЕ) ~ // содержит стек 1пс Соя; индекс нержины стека риЛ11с: ~о1<( альт.() ( соя =- О!) !/ инициализация стека уо1<( ризЛ (ЯгасКТуре сЛ); // помещает объект в стек Ягас)<туре рор() 1 // выталкивает объект из стека !! Размещение объекта в стеке сещр1асе <с1аяя ЯсасКтуре> ыоьб зсасК<ЯсасКТуре>::ризЛ(31асКТуре оЫ с ту ( Тй (ЕОЗ=313Е) Сигом Ятями; ) саЕсЛ (1пс) ( соцс « "стек полон~в"; гегцгц; я(сК[тоя) = оЬ; соя++; выталкивание объекта из стека бещр1асе <с1аяя 31асКТуре> Ясас)<Туре ЗСасК<ЯтасКТуре>.":рор() сгу ( 1й (тоя= — 0) Сигом О; сассЛ (1пс) ( сопс « "Стек пуст~в"; гегыгп О; // возврат тб ля при пустом стеке ) соя--; геспгп вссК(соя) Самоучитель Сн- )и( гватц () демонстрация символьных стеков всас)с<сЬаг> з1, з2т О создание двух стеков 1пс 1; Инициализация стеков з1.1птк(); з2.1птс () ) з1.
рцзЬ ( ' а ' ); з2.ризЬ('х'); з1.рцзЬ('Ь'); з2.рцзЬ('у'); з1.ризЬ('с'); з2.рцзЬ('г'); гол(1=0; 4<34 1++) соцс « ")4в стека 1: <с в1.рор() с< Хог(1=0; 1<4) 1~-+) соцс << "Из стека 2:" << з2.рор() <с "п"; Демонстрация стеков со значениями типа ооцЫе запас)с<с(оиЬ1е> с(з1, пз24 /l создание двух стеков Инициализация стеков с(з1.1п1к(); с)з2.1пте() ) с)з1.рцзЬ(1.1); с(з2.рцзЬ(2.2); с(з1.рцзЬ(3.3); с)з2.рцзЬ(4.4); с)з1.рцзЬ(5.5); с(з2,рцзЬ(6.6); Йод(1=0; 1<З; 1-и-) соц" « "из стека 1:'* « с)в1.рор() « "~п", ЙОГ(1=0~ 1<4; тьа) соцс « "РЬ стека 2:" С< с)в2.рор() « "~п"; гепцоп 0; 8.
Если при ошибке выделения памяти оператор пе)ч возбуждает исключительную ситуацию, вы можете быть уверены, что эта ошибка будет обработана тем или иным способом (даже путем аварийного завершения программы). И наоборот, если при ошибке выделения памяти оператор печу возвращает нулевой указатель, а вы забыли организовать контроль этого возвращаемого значения, то такая ошибка может остаться незамеченной и в конечном итоге при попытке использования нулевого указателя привести к краху программы, причем будет чрезвычайно трудно обнаружить причину этого. Приложение В. Ответы на вопросы и решения упражнений б35 ГЛАВА 12 Повторение пройденного 1. В С++ родовая функция определяет общий набор операций для данных разных типов.
Она реализуется с помощью ключевого слова 1егпр1а1е. Ниже представлена основная форма родовой функции: Ееер1аЕе <С1аяа лауре> везер виачввмв жег 4ееищии(сп аараивтроа) // 1 2. В С++ родовой класс определяет все операции класса, но действительные данные задаются в качестве параметра при создании объекта этого класса. Ниже представлена основная форма родового класса: Септр1Ме <с1авв ТЕурв> с1авв иив жласса // 1 3. 1(апс1пс)е <1овегеагв> ияпя пагпсврасс яс1; // Возврагцаст значение а в степени Ь тегпр!ате <с1авз Х> Х аехр(Х а, Х Ь) ( геаи1т = 1; аког(1=01 1<Ь; 1++) гови1Г "= а; гетигп гевн1еу )пГ гаван ( ) ( сопс « овир(2, 3) сс епб1; соп1 « оехр[1О .О, 2. О); гстигп О; 4. ц1пс1иое <1оа~геатп> п1пс!псе <1асгеап~> ияпа пагпсзрасе зЫ; 636 Самоучитель Сч.ч.
Гегор1а?е <с1авв Соотг)Туре> с1ааа соогс) ( Соотг)Туре х, у; рцЬ11с: соого(Соогс(туре ), Соогс1Туре 3) ( х = 1; у = 1; уо)с) а)гои() ( соцГ «х « ", " «у « еос?14 'п~г паз.п () ( сов ос)<)пс> о1 (1, 2), <2(3, 4); о1.анои() ' о2.а?1ои() г соогс)<с?оцЬ1е> оз (О. О, 0.23), о4 (10. 19, 3. 098); оз.автои()г о4.алои()г гесегп 0; 5. Совместная работа инструкций 1гу, са1сЬ и 11)гоч происходит следующим образом.
Поместите все инструкции, для которых вы хотите обеспечить контроль исключительных ситуаций, внутри блока ггу. При возникновении исключительной ситуации она возбуждается с помощью инструкции 11)гож и затем обрабатывается с помощью соответствующей инструкции са?сЬ. б. Нет. 7. Вызов функции гегаиаа$е(~ происходит в том случае, если исключительная ситуация возбуждается той инструкцией 11?гож, для которой нет соответствующей инструкции са1сЬ. Вызов функции ипехресге(10 происходит в том случае, если исключительная ситуация не указана в списке типов инструкции Йгои.
8. са4с)((...) Упражнения 12.1 1. Динамическая идентификация типа необходима потому, что в С++ при компиляции программы не всегда есть возмозможность выяснить, на объект какого типа указывает указатель базового класса или ссылается ссылка базового класса. 2. Если класс ВавеС1авв перестает быть полиморфным классом, на экране мы увидим следующее: Приложение В. Ответы на вопросы и решения упражнений Тип переменной 1 — это 1пк Указатель р указывает на объект типа ВаяеС1аяя Указатель р указывает на объект типа ВаяеС1аяя Указатель р указывает на объект типа ВаяеС1аяя 4. 1й(ЬуреЫ ('р) == суре1с((П2)) 5.
Истинным. Несмотря на то, что здесь используется один и тот же класс- шаблон, тип данных в каждой из версий различен. 12.2 1. Оператор дувише саят позволяет проверить правильность выполнения операции приведения полиморфных типов. 2. ()1пс1ийе <1оялтеаш> ((1пс1ис(е <(уре1п(о> ня1пя паптеярасе я(с(; с(аяв В 1 У)гбпа1 УоЫ й() () 1 с с1аяя В1: рпЬ11с В уоЫ ЙО () с1аяя В2: рнЬ11с В [ .оЫ Й(О () бпб ша)п( ) ( В +Р7 Р2 ОЬ; р = дупаштс саак<В2 *> (аоЬ) Ы(р) сопб « "Приведение типов прошло успешно"; е1яе сове « "Приведение типов не произошло"; теентп 0; 3.
(ш та1п О 1 г1;; Язарс ~р; Самоучитель С++ аког(1=0; 1<)0~ (ч+) р = деляга~от()г УУ получение следующего объекта сопя « суреъо("'р) .пагпе( ) « епс)1; объект изображается на экране только н тон случае, если это не объект типа Ии113Ьаре 11(!бупап~вс сазп<Ып115Ьаре "> (р)) р->ехалр1е(); еппгп 0; 4. Нет. Указатели Вр и Рр указывают на объекты совершенно разных типов, 1, Новые операторы приведения типов обеспечивают более безопасные и понятные способы выполнения операции приведения типов. 2.
()1пс1ис(е <1озсгеат> пятну папеярасе зЫ; чотб Г (сопзс ЙопЫе Я1) ( бопЫе яу сопел саад<с)опЬ1е я> (1); ч = 100.0; 1пс та1п() ( с)опЫе х — 9В. б; соШ «х < епс)1: Г(х) х сопс « х « еги21; геспгп 0; 3. Поскольку оператор сопят сазФ лишает объекты атрибута сопя(, его использование может привести к неожиданной и нежелательной модификации объектов.
Приложение В. Ответы на вопросы и решения упражнений Проверка усвоения материала главы 12 1. Оператор 1уре!д возвращает ссылку на объект класса 1уре 1а(о, содержащего информацию о типе, 2. Для использования оператора (уреЫ в программу необходимо включить заголовок <1уре1п$о>.
3. Ниже представлены новые операторы приведения типов. Оператор Назначение 4. Ф1пс1вс(е <1оавтеата> (11пс1цде < уреупйо> пв1по пагаеарасе всб; с1авв А ( я1тваа1 ~го1б 1() (1 1' с1ааа в: рвЫ1с л ( с1авв С: риЫ1с В ( 1' 1.гс тауп ( 1 ( сов(. « "Введите О для объектов типа А, совс « "1 для объектов тига В или"; сорб « "2 для объектов типа С.М"Г сзп»з г 1й (1==1] р = й1Ь оЬ; е1ве Н (1-=21 р =- ас оЬ; е1ве р = йа оЬ; бупагп(с саа1 ге~ п1егрге( сват в1абс саз1 сопв1 сав1 л *р, а оЬг в Ь оЬ; ~ с оЬ; 1пс Выполняет операцию приведения полиморфных типов Преобразует указатель на один тип в указатель на другой тип Выполняет операцию "обычного" приведения типов Лишает объекты атрибута сопвт Самоучитель С++ 640 1Е (луре1<((*р) == Ьуре1б(А) ) сонс « "Объект А" 11 (пурЕЫ(+р) =-.— ~урЕЫ(В) ) соне « "Обьект В"; 1л (ЬуреЫ(+р) —.- Ьуре1<((С) ) сопл « "Объект С"; те итп О; 5.