Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 202
Текст из файла (страница 202)
Классы ил(пк-((ес!ага Поп (етр(а(е ((ее!ага((оп тетЬет-((ее!ага(ог-1(л(( тетЬег-(1ес1ата(ог тетЬег-((ес!ага(от-1!л(, тетЬег-((ес!ага(ог тетЬет-аес!ага(от( ((ее!ага(ог риге-лресфег,р( с(ес!ага(ог сопл(ап(-!п(1!а!(лет,р, 1((еп(З(ег р, . сопз(ап(-ехртелл(оп рите-лресфег: — 0 сопл(ап(-(п!1(а1!гет( = сопл(ап(-ехртелл!оп Ради совместимости с языком С допускается в одной и той же области видимости объявлять класс и не-класс с одним и тем же именем 185.7). Например: раис( л(а( 17*... *7) ( (п( л(а((слог* пате, раис( ма(* Ьи!) В этом случае, имя з(а( — это не имя класса; на класс нужно ссылаться с помон(ью классового префикса.
Константные выражения определяются в 8С.5. А.8.1. Производные классы См. главу 12 и главу 15. Ьале-с1аиле( : Ьале-лресфет-1Ы( Ьазе-зресфег-1О(: Ьале-лресфег Ьале-лресф(ет-1(л(, Ьале-лресфег Ьале-лресфег: ::,, пел(е((-пате-лрес(фег р, с!азл-пате Рьгтеа1 асселл-зРесфет,р,,р, пел!е((-пате-лРес(фет,р, с!ат-пате асселл-лрес фег р т г т е а т,р,,р, пел(е((-пате-лресфет,р, с!ат-па т е ассет-лресфег: ргтеахе рсосесгес( рао|ьс А.8.2.
Особые функции-члены См. 811.4 (операции преобразования), 810.4.6 (инициализация членов класса) и 812.2.2 (инициализация базового класса). сопрегл!оп-)йпс((оп-!((; орегааог сопретл(оп-(уре-1(( Приложение А. Грамматика сопрегиоп-(уре-Ы( (уре-зрес)((ег-зе(! сопрегз[оп-((ес!ага(ог,р, сопрегз!опЫес1ага(ов Р(г-оРега(ог сопгегз!оп-((ее[ага(ог р, с(ог-!п(1!а1!гег( вет-!и!(!а!!гег-!!з( тетив!Иа![гег-1!з1: тет-!и!(!а1!гег тет-вряа1ггег, тет-(пЫа!ггег-![з( тет-ии(!а!!геи тев-ЫЖа1иег-Ы [ ехргезз!оп-((з(,р, ) тет-!и!(!а!!гег-!а( ::,р, пез(е((-пате-зрес()(ег,р, с1ат-пате ЫеппУ)ег А.В.З. Перегрузка См. главу 11. орега(ог-!ипсноп-Ы: орега1ог орега(ог орега(ог( опе оГ пее <)е1еге оее[1 / Ъ % яя оетеге[) й < > «»»= «= ->* -> () [) А.9.
Шаблоны Шаблоны объясняются в главе 13 н 5С,13. (етр!а(е-(!ее!ага([оп( ехрогс,р, сепртаге < 1етр(а(е-рагате!ег-!!и > ((ее!ага!!оп (етр!а(е-рогове(ег-1(зс (етр1а(е-рогове(ег !етр!а(е-рагате(ег-1!з(, (етр!а(е-рогове(ег (етр[а(е-ра готе(ег( 1уре-рогове(ег регате(ег-((ее[ага([оп (уре-рога те(ег( Сзааа !аЕП1фЕГ,р, с1аяя Ыеп(1~)ег,р, - (уре-Ы суреоаее Ыепп[(егрр, сурепапе !депп[!ег,р, = (уре-Ы сепртасе < (етр(а(е-рагате(ег-1(з( > сзаяя Ыеп(а)ег,р, гепрзаге < (евр!а(е-рагате(е(-1[з( > стаяя Ыеп!фег,, Ы-ехргезиоп А.) О.
Обработка исключений 9ЯЗ гетр!осе-и1: сетр1осе-пате < сетр(асе-агдитепс-!йс,р, > сетр1асе-патес Ыепсс)сег гетр!асе-агяитепс-!(зсс гетр!осе-агяитепс гетр(асе-агяитесс(-1(зс, гетр(асе-агаитепс сетр!асе-агяи тепсс аззсяптепс-ехргеззсоп суре-Ы Ы-ехргезгпоп ехр1(с(с-(песа асса!!оп' еес»рхаее бес!агасюп ехр1(ссс-зрес(а1(за(санс сепр«асе < > бес!аганоп Явная специализация аргументов шаблона открывает возможность запутанной синтаксической неоднозначности. Рассмотрим пример: »оЫ Ь () ( с<1> (О) с ?? неоднозначностьс ((С)<1)>(0) ияи ((<1>)(0)? ?? разрешение неоднозначности: вызывается (<1> с аргументом 0 ) ?? синтаксическая ошибка ?с' осс 1< а>Ь > (0); У< (а>Ь) >(О) ' Подобная лексическая неоднозначность возникает, когда оканчиваюшие знаки > расположены вплотную другк другу.
Например: 11зс<еессог<1пс» Ь>1с ?? еггогс неожиданная операция» (сдвиг вправо) дзс< иессог<спс» Ь2с ?? правил»нос список векторов Обратите внимание на пробел между двумя знаками >; » — это операция сдвига. Это может стать источником путаницы. А.10. Обработка исключений См. 58.3 и главу 14. оу-нос)сс еху сотроипдчпасетепс Ьапд!ег-зеа Разрешение неоднозначности просто и эффективно: если 1' — имя шаблона, то )< — это начало квалифицированного имени шаблона, так что последуюшие лексемы должны интерпретироваться отталкиваясь от этого факта; в противном случае < означает знак «меньше, чем». Аналогично, первый невложенный знак > оканчивает список аргументов шаблона.
Если требуется знак «больше, чем», то следует применить круглые скобки: Приложение А. Грамматика адиле!!оп-!гу-ЫосЬ; сгу стог-!л!г!а!!гегт~ Гипсяоп-Ьо4у Ьапа1ег-зес) Ьал41ег-зез!г Ьапз!1ег ЬапИег-зет!и, Ьал4!ег. сакса ! ехсер!!оп-Иес!агалол ! сатрапа-з!а!етепг ехсер!!ол-4ес1агаг!оп: туре-зрес!7)ег-зез1 Иес!агагог !уре-зрес(!) ег-зев аьтгасгЫес!агагог туре-зресз) ег-зес! гЬгол~-ехргезз!ол: сахои азз!ялтепз-ехргезз!ол,р, ехсер!!оп-зреса)са!!оп; оре Ы"1!егор !уре-Ы-!цз: !уре-Ы !уре-Ы-Ьзз, гуре-и! А.11. Директивы препроцессора Препроцессор — зто относительно простой макрообработчик, работающий в основном с лексемами, а не с отдельными символами.
Дополнительно к возможности определять и использовать макросы (57.8) препроцессор обеспечивает механизмы для включения текстовых файлов и стандартных заголовочных файлов 59.2.1), а также для условной компиляции, базирующейся на макроопределениях (59.3.3). Например: ФфОРТ==4 е1лс!и4е "ЬеаИег4. Ь" Фе1зТ 0<ОРТ !ллс1ийе "зотеЬеаз!ег. Ь " $е1зе Нпс1и4е <сзЫИЬ> !)еп4зу Все директивы препроцессора начинаются с символа Ф, который должен быль первым не пробельным символом на своей строке. ргергосезз!пя-!)!е: егоир,л я сир: у.сир-раг! ягоир ягоир-раг! дгоир-рагс рр-!о/селе,р, пел -11пе 1у зесг!оп сои!го!-1Ые Приложение В Совместимость Вы следуйее своим обычаям, а я буду следавагпь своим.
— Ч. Нэльер Совместимость С и С++ — «тихие» отличия — код на С, не являющийся С++-кодом — нежелательные особенности — код на С++, не являющийся кодом на С вЂ” старые реализации С++ — заголовочные файлы — стандартная библиотека — пространства имен — ошибки выделения памяти — шаблоны— иннцнализаторы в операторах гвг — советы — упражнения. В.1.Введение В данном приложении обсуждаются расхождения между С и С++, а также между стандартом С++ (180/1ЕС 14882) и более ранними реализациями языка С++. Мы хотим документировать эти различия, которые могут создать для программиста некоторые проблемы, а также указать на пути их преодоления.
Большинство таких проблем возникают, когда пытаются перевести С-программу на язык С++, когда осуществляют переход с одной из ранних версий С++ на другую или когда компилируют современную С++-программу старым компилятором. Моя цель — не утопить вас в огромной массе всех потенциально возможных проблем совместимости с каждой из существующих версий С++, а, скорее, перечислить наиболее типичные проблемы н представить их стандартные решения. При рассмотрении вопросов совместимости очень важно учесть диапазон реализаций, при которых программа должна работать. Для изучения С++ целесообразно выбрать наиболее полную и удобную реализацию.
Для производства конечного отчуждаемого продукта больше подходит консервативная стратегия, призванная максимизировать число систем, с которыми продукт будет работать. В прошлом зто служило оправданием бегства от новшеств С++. Однако теперь реализации сближаются и необходимость в переносимости с одной из них на другую уже не требует такой осторожности, как раньше. 948 Приложение В. Совместимость В.2. Совместимость С и С++ За минимальными исключениями язык С (имеется в виду стандарт С89, 180/1ЕС 9899:1990) является подмножеством С++.
Наиболее значимые различия возникают из-за большей приверженности С++ статической проверке типов. Хорошо написанные на С программы часто оказываются и допустимыми программами на С++. Компилятор выявляет все различия между С и С++. В.2.1. «Тихие» отличия За небольшими исключениями программы на С и С++ имеют одинаковый смысл. Но счастью, зти исключения («тихие» отличия) непринципиальны. В языке С размер символьной константы и перечислений равен з)зео(((п(). В С++ я(аеог'( 'а' ) равен в(еео1'(айаг), а размер перечислений определяется конкретной реализацией (84.8). В языке С++ есть комментарии О, а в языке С их официально нет (но многие реализации их допускают).
Это отличие можно использовать для написания программы, ведущей себя на разных языках по-разному. Например: 1п11(1п1 а, 1пг Ь) ( ге(ига а //* маловероятно */ Ь /* нереалистично: точка с запятой на отдельной строке во избежание синтаксической ошибки * l ! Международный стандарт языка С пересматривается с целью введения комментариев !!. Имя структуры, объявленной во вложенной области видимости, может скрыть имя объекта, функции, перечисления или типа из объемлющей области видимости. Например: (пг х (99); 1о(а г() ( Мгис1 х ( Ьлз а; ); з(ееог (х) ) l * в С - размер массива; в С++ - размер структуры * ! ) В.2.2.