Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 200
Текст из файла (страница 200)
Роли классов 10. ("2.5) Реализуйте систем у объектного ввода/вывода из Э25.4.1 для нескольких типов, включая целые числа, строки и классовую иерархию по вашему выбору. 11. (*2.5) Определите класс огогаЫе в качестве абстрактного базового класса с виртуальными функциями млге оиг () и гела (л () . Для простоты предположите, что символьная строка описывает место для долговременного хранилища. Воспользуйтесь классом ФогаЫе, чтобы написать средство, позволяющее сохранять на диске и читать с него объекты классов, производных от огогаЫе. Протестируйте это средство с парой классов по вашему выбору.
12. (*4) Разработайте базовый класс Регзлгелг с операциями ваге() и ло ваге(), которые определяют, записываются ли объекты в долговременное хранилище деструктором. Кроме указанных операций какие еше полезные операции мог бы предоставлять класс РегзмтелО Протестируйте класс РегягГеш с парой классов по вашему выбору. Является ли Регяжелг узловым классом, конкретным типом или абстрактным типом? Почему? 13.
(*3) Напишите класс отлей, для которого можно сменить представление на стадии выполнения программы. Подсказка: «любую проблему можно решить, введя еше один уровень косвенности». 14. (*3.5) Определите класс Орег, содержащий идентификатор типа И (хл(л» нли С-строка) и операцию (указатель на функцию или функциональный объект). Определите класс Саг оЬ)ест, который содержит список элементов типа Орег и гоЫ*. Снабдите Саг оЬ|еег операциями аМ орег(Орег), которая добавляет Орег к списку; гетоге орег (И), которая удаляет Орег, идентифицируемую с помощью И из списка; орегагог() (И,агй), которая активизирует Орег, идентифицируемую с помощью И. Реализуйте стек котов посредством Саг оЬ)есг. Напишите небольшую программу для тестирования этих классов.
15. (*3) Определите шаблон ОЬ)еег на базе класса Саг оЬ)еег. Используйте ОЬ)еег для реализации стека строк. Напишите небольшую программу для тестирования этого шаблона. 16. (*2.5) Определите вариант класса ОЬуеег под именем С7аи, который гарантиру- ет, что объекты с одинаковыми операциями совместно разделяют список операций. Напишите небольшую программу для тестирования этого шаблона.
17. (*2) Определите шаблон огасй, который предоставляет традиционный и безо- пасный по типу интерфейс к стеку, реализованному шаблоном ОЬуеег. Сравните этот стек с вариантами стековых классов из предыдущих упражнений. Напишите небольшую программу для тестирования этого шаблона. 18. (*3) Напишите класс для представления операций, которые нужно отправ- лять для исполнения на удаленный компьютер. Протестируйте этот класс, либо отправляя команды на другой компьютер, либо при помощи записи команд в файл с последующим их чтением и исполнением.
19. (*2) Напишите класс для композиции операций, представленных объектами функциональных классов (объекгами-функциями). Для двух обьектов г'и а, Соглрозе (г', я) должно порождать объект, который может быть активизирован с аргументом х, пригодным для я, и с возвратом ~(8(х) ), при условии, что возврат я() является приемлемым аргументом дляу(). Приложения и предметный указатель В приложениях представлены грамматика языка С++, обсуждение вопросов совместимости С и С++ и вопросов совместимости между стандартом С++ и пред- стандартными версиями, а также множество технических деталей. Для стандартной библиотеки представлены средства интернационализации, а также концепции, гарантии и методы реализации безопасности при генерации исключений.
Предметный указатель достаточно обширен и является неотьемлемой частью данной книги. Главы А. Грамматика В. Совместимость С. Технические подробности Р. Локализация Е. Исключения и безопасность стандартной библиотеки Предметный указатель Приложение А Грамматика Самая большая опаснопп ь для преподаваееля— учиаь словам, а не вещам. — Марк Блок Введение — ключевые слова — лексические соглашения — программы — выражения — операторы — объявления — классы — производные классы — особые функции-члены — перегрузка — шаблоны — обработка исключений — директивы препроцессора. А.1. Введение Итоговое концентрированное изложение синтаксиса С++ призвано быть формальным дополнением и должно способствовать лучшему его пониманию.
Оно не является абсолютно точным и строгим описанием языка С++. В частности, описанная здесь грамматика содержит некоторые расширения допустимых для С++ конструкций. Требуется применять правила разрешения неоднозначностей для различения выражений от объявлений (5А.5, 5А.7). Кроме того, для выправления синтаксически корректных, но бессмысленных конструкций нужно применять правило доступа, правило типов и правило разрешения неоднозначностей. Стандартные грамматики С и С++ различаются с синтаксической точки зрения минимально, в большей степени через ограничения. Это способствует точности, по не читаемости кода. Приложение А.
Грамматика 926 А.2. Ключевые слова Новые контекстнозависимые ключевые слова вводятся в программу с помощью !урез!еУ(54.9.7), пространств имен (88.2), с помощью объявлений классов (глава 10), перечислений ($4.8) и шаблонов (глава 13)'. гуреде7'-лате: Ыепгфег огфгпа!-патеерасе-пате: Ыелгфег латезрасе-а!1аз: Ыепгфег епит-пате: Ы пф гетр!аге-лате: Ыелгфег Заметим, что гурег!е)'-имя, именующее класс, есть также и с1аш-имя. Если идентификатор явным образом не именует тип, то считается, что он именует что угодно, но только не тип (см, также ВС.13.5).
Ниже перечислены ключевые слова языка С++: Ключевые слова С++ Тр ри апз! лого !пвле ахт ли!о ге!игл гурепате ~ Ыгалх( !оля илюл илх!ялед Ыгог х!елед тигаЫе их!пя х!селу Ьоо! еае латехрасе Ьгеай ~ епит еганс гоЫ Ыггиа! лел ~ ехр1!с1! ыаас сат сазе 1 Ввиду большой пракгической ценности и фактической самоочевидности (для разработчиков компиляторов) представляем авторское формализованное изложение грамматики в точном оригинальном виде (без перевода простейших терминов). Здесь ьи — это сокращение от орйопа) (необязвтельно). — Прим. ред.
латезрасе — лате: опк!па1-патезрасе-пате патеерасе-а!!ах с1аш-лате: Ыел!фег гетр1аге-Ы солипие деуаи!! з(е!еге в!оиЫе Нулат!с сага гея!хгег гет<егрге! сахг !урез!ер гуреЫ 92У А.З. Лексические соглашения А.З. Лексические соглашения Стандартные грамматики языков С и С++ представляют лексические соглашения как грамматические сущности. Это добавляет точности, но не всегда способствует читабельности текстов: Ьех уиай ЬехаЫес!та1-Йяу! ЬехаИес!та1-Йя!! ЬехаЫесута1-Йяу! Ьехадесута!-Йуу!! илл егеа1-сЬагасге«-лате: ~о Ьех-диас! М Ьех-диаЫ Ьех-диаЫ ргергосеееупе-гоаеп: ЬеаЫег-лате ЫелЬУУег рр-питЬег сЬагасгег-1!!его! а!гулу-Ыега! ргергосеее!ля-ор-ог-риис еасЬ пол-и Ьнемрасе сЬагасгег йа! сопла! Ье оле оу йе аЬоие гоЬел: Ьуел~фег !сеул оп! я!его! орегагог рипсуиагог Ьеадег-лате: <Ь-сЬаг-еедиелсе> "д-сЬагмедиепсе" Ь-сЬагмедиелсе: Ь-сЬаг Ь-саагмедиепсе Ь-сЬаг Ь-сЬат апу тетЬег оу йе хоп«се сЬагасгег ее! ехсерг пев-1!пе ат! > д-сЬагмедиелсег д-сЬаг д-сЬагмедиепсе д-сЬаг Приложение А.
Грамматика 928 рр-литЬет Й!ей . Й!д!с рр-питЬег Й!и!1 рр-питЬег лоий!е!с рр-питЬег е е!ел рр-питЬег Е с!Ри рр-литЬег . !Йепфегс по ой!е!с !Йепс(1) ет попй!ей !Йепгс)сет Й!фс попйд(сс опе оГ ил!хетта!-сйатассеь.-пате аЬсоегнпхОК СсВСОВРОН 1 в п К с я Т и Р о В Я орл ми о и х у т тоуихуг Йсе!и опе оГ О 1 2 3 4 5 б 7 В 9 ргергосезс(пе-ор-от-риис! опе оС ) ( ) 4 ()с) %> Ъ:Ъс % ьгсапй «= »= «» -»* ... пеи ае1ете ап<) апб ес ог ес( Ьсьог совр поп ог поп е<( хог хоп ес 81ес.а1с т селе«-1!сета! сйагассег-1йе«а1 с)оа!!пе-1!сего! ясг!пе-й!е> а1 Ьоо1еаи-1йега! си!еле«-йсегай Йейта1-1с1ега( !лсееег-сиЯос,ж ос!а1-!йега( си!еле«-зсй)гсх,р, Ьехайесстас-йсега! !псехег-сиЯахол Йес!та1-1йес.а11 палее«о-Йсесс Йесипа1-й!его! Й!и!с асса!-1йега11 О осса1-1йегас асса(-Й!асс Ьехайесииа1-йсега11 Ох Ьехайес!та1-йесс Ох Ьехайес1та1-Йсей ~1-сйагс апу тетЬет оГсйе сои«се саагас!ег сес ехсерс пех-!(пе апй 929 А.З.
Лексические соглашения Ьехаг!ес1та1-11!ета! Ьехаг!ес!та1-йез! иолхего-а!!е!и оие о! 1 2 3 4 5 б 7 8 9 ос!а1-з!!е!г! оие ог О 1 2 3 4 5 б 7 итфпейзиЯх: опе о! а О 1олд-лф1х! оие о! 1 Ь с-сЬакс аиу тетЬет о!' гЬе зоил е сЬагасгет зе! ехсер! йе з!пе!е-долге, Ьаст!тЬ, о! пте !те сЬапзсгег езсаре-зеаиелсе ипгиегза1-сЬагастег-пате з1тр!е-езсаре-зез!иепсе! опе о! 17 11 ~а 1Ь 18 1п 1х 15 1ч ос!а!-езсаре-зеаиелсе! 1 ос!а!-з!!я1! 1 ос!а!ей!р! лога!-йе1! 1 ос!а!-Й1е1! ос!а!-Йд!! ос!а1-с!!д1! Ьехас!ес1та1-езсаре-зедиепсе! 1х Ьехаз!ес!та1-с!!и1! Ьехаг!ес!та1-езсаре-зедиепсе Ьехадес!та1-Йр! !1оа!!лу-!!!его 1: 2гасг!опа!-силезии! ехропелг-рог!,р,Яоаз1лд-зим,р, с!!е!з-зеаиепсе ехропепт-рат! Яоагзпд-зиЯи,р, Ьехаг1ес1та!-Йр!' опе о! О 1 2 3 4 а ь с а е А В С О Е !п!еиег-зифх: ииз!яиц-зи113х 1оия зуЯЬ~р~ !илу-зим илзфпейзиЯп,р, сЬагасгег-!Иега1: 'с-сЬаг-зеоиелсе' ь'с-сЬаг-зеуиепсе' с-сЬаг-зеаиепсе! с-сЬаг с-сЬаг-зедиеисе с-сЬаг езсаре-зе!!иелсе! з1тр1е-езсаре-зеаиеисе оста!-а!саре-зеаиеисе Ьехас!ее!та!-езсаре-зеЕиепсе 5 б 7 8 9 Г Г Приложение А.
Грамматика )гас!!опа!-сопзсапс! Лясс-зедиепсе,р, . Йе!с-зедиепсе д!есс-зедиепсе . ехро пел!-рапи е з!яп,з, с!се!с-зедиепсе в зсяп,пйе!с-зедиепсе з!ел! оле оГ сС!есс-зедиепсе! д!я!с сС!рс-зедиепсе Йе!с ~1оас!пл-зи()гсх опе оГ Г 1 Г Ь зсг!пя-1!сего!! "з-сЬаг-зедиепсе,рг г,"'с-аГаз-деспсе,е," з-сЬаг-зедиелсе: з-сЬаг з-сьаг-зедиепсе з-сБаг з-сЬагс алу тетЬег огйе зоигсе саас ассе! зес ехсерс с!оиЫе-даосе, ЬасазсазЬ, ог лесе-1!ле езсаре-зедиепсе илсиета1-сЬагассег-пате Ьоо1еап-1йега1! га1ае кхее При составлении лексемы выбирается наиболее длинная возможная посяедоваспезьпость символов.
Например, доийе составляет единую лексему, а не комбинацию из з(о и ибде; последовательность символов +ее есть ++ с последующим е. А.4. Программы Программа — ' это набор единиц трансляции, объединяемых в процессе компоновки (1)п)опя) (В9.4). Единица трансляции (!гааз!абоп-ип1!), часто называемая исходпым файлом (зоигсе ~~1е) — это последовательность обьявлелий (дес1агабопз): !гала!адоп-ипи! с!ее!ага!!ол-зед,р~ А.5. Выражения Выражения рассматриваются в главе 6 с подробным перечислением в В6.2. Определение списха-выражепий (ехргезз!оп-1сз!) эквивалентно определению выражения (ехргезз(ол). Имеются два правила для отличия запятой как операции (операция следования — зес)цепс!пя) и как разделителя списка аргументов функции (В6.2.2).