Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 204
Текст из файла (страница 204)
Код на С« ~-, не являющийся кодом на С В данном разделе перечисляются возможности С++, не обеспечиваемые С. Эти осо- бенности рассортированы по назначению. Однако их можно классифицировать по- разному, н многие особенности имеют несколько назначений, так что к данной клас- сификации не следует относиться слишком серьезно. ° Особенности, предназначенные прежде всего для удобства записи: [1] комментарии с помощью//: в настоящее время добавляется к С; [2] поддержка ограниченного набора символов (9 В.3.1); [3] поддержка расширенного набора символов Я В.З.З); в настоящее время добавляется к С; [4] неконстантные инициализаторы для объектов со статическим хранением (9 9.4.1); [5] солИ в константных выражениях; [6] объявления как инструкции (9 6.3.1); [7] объявления в нннциалнзаторах/ог-цнг~лрухции н условных инструкциях (6 6.3.3, 6 6.3.2.1 ); [8] имена структур не обязательно предварять словом Игисг(9 5.7).
Особенности, предназначенные прежде всего для усиления системы типов: [1] проверка типа аргумента в функции (9 7.1); была добавлена в С (9 Б.2.2); [2] компоновка, безопасная с точки зрения типов (9 9.2, 9 9.2.3); [3] распределение свободной памяти при помощи пеши Не1е1е(9 6.2.6, 6 10.4.5, 9 15.6), [4] солИ (9 5А, 6 5А.1); было добавлено в С; [5] логический тип Ьоо1(9 4.2). [6] новый синтаксис приведения (9 6.2.7). Срслства, предназначенные для поддержки типов, определяемых пользователем: [1] классы (глава 10); [2] Функции-члены (9 10.2.1) и классы-члены Я 11.12); [3 [ конструкторы н деструкторы (9 10.2,3, 9 10А.1); [4] производные классы (главы 12 н 15); [5] виртуальные функции и абстрактные классы (9 12.2.6, 9 123); [6] контроль лоступа, открытый/защищенный,'закрытый (рий1с/рго1ес1еф рпва1е) (9 10.2.2, 9 15.3, 9 В.11); 898 Приложение Б.
Совместимость [7] друзья Я 11.5); [8] указатели на члены (9 15.5, 9 В.12); [9] статические члены (9 10.2А); [10] члены ти1иВ!е (9 10.7.2); [11] перегрузка операторов (глава 11); [12] ссылки (х 5.5). Особенности, предназначенные в первую очередь для организации программ (в добавление к классам): [1] шаблоны (глава 13, 9 В.13); [2] встроенные функции (9 7.1.1); [3] аргументы по умолчанию (9 7.5); [4] перегрузка функций (9 7.4); [5] пространства ил~ен (9 8.2); [б] явное разрешение области видимости (оператор::; 9 4.9.4); [7] обработка исключений (9 8.3, глава 14); [8] определение типа во время выполнения (ч 15.4).
Ключевымн словами, добавленными в С++ (9 Б.2.2) можно пользоваться для выявления спепифическпх средств С++. Однако некоторые средства, такие как перегрузка функций и солз1в константных выражениях, не идентифицируются по ключевым словам, Кроме перечисленных здесь языковых особенностей библиотека С+в (9 16.1.2) по большей части специфична д.ля С++. Для определения того, каким компилятором должна компилироваться программа — С или С++, — можно пользоваться макросом ср1изр1из(з 9.2А). Б.З. Старые реализации С++ С++ постоянно использовался, начиная с 1983 года (9 1.4). С тех пор было определено несколько версий, и появилось несколько независимо разработанных реализаций. Фундаментальная цель попыток стандартизации заключалась в том, чтобы разработчики реализаций и пользователи смогли работать с единым определением С+в.
Однако, до тех пор, пока это определение на распространится повсеместно в сообществе С++, нам придется смириться стем фактом, что не каждая реализация обеспечивает все средства, описанные в этой книге. К сожалению, не редкость, когда первое серьезное знакомство с С++ происходит с реализацией пятилетней давности. Как правило, это вызвано тем, что такие реализации широко доступны и свободно распространяются. Имея выбор, ни один уважающий себя профессионал не будет работать на таком антиквариате.
А для новичка устаревшие реализации оборачиваются серьезными скрытыми затратами. Отсутствие языковгдх средств и поддержки со стороны библиотеки означает, что новичку придется бороться с проблемами, устраненными в новых реализациях. Кроме того, использование сравнительно бедных устаревших реализаций наносит вред стилю программирования новичка и порождает искаженный взгляд на то, чем является С++ на самом деле.
Лучшее подмножество С++ для первоначального изучения — не набор возможностей низкого уровня (и не общее подмножество С и С++; 9 1.2). В частности, чтобы облегчить обучение и получить хорошее первое впечатление о программировании на С++, я рекомендую опираться на стандартную библиотеку и шаблоны. Первый коммерческий выпуск С+ь состоялся в конце 1985 года. Язык определялся первой редакцией данной книги. На том этапе С+в не предлагал множественного насле- 897 Б.З. Старые реализации С++ дования, шаблонов, информации о типе во время выполнения, исключений и пространств имен. Сегодня я не вижу смысла пользоваться реализацией, не ооеспечивающей хотя бы части этих возможностей.
В 1989 году я добавил к определению множественное наследование, шаблоны и исключения. Однако ранняя поддержка шаблонов и исключений была шероховатой и зачастую довольно убогой. Если в старых реализациях у вас возникнуг проблемы с шаблонами или исключениями, поскорее обновите версию. Вообще говоря, по мере возможности разумно применять реализацию, совпадающую со стандартом, н минимизировать использование аспектов языка, зависящих от реализации или неопределенных.
Проектируйте так, как будто вам доступен весь язык, а затем ищите нужные средства. Это ведет к лучше организованным программам, которые легче сопровождать, по сравнению с проектированием, используюп!им подмножество С++, отвечающее «наименьшему общему знаменателю.. Также будьте осторожны в использовании расспирений, специфических для данной реализапии языка, и применяйте их только в случае крайней необходилюсти. Б.3.1. Заголовочные файлы Традиционно все заголовочные файлы имели расширение .Ь. Таким образом, реализапии С++ вводили заголовочные файлы, такие как <тар.й> и <1оз1геат.й>. Из соображений совместимости большинство реализаций по-прежнему так и делают. Когда комитету по ст з ндартам понадобились заголовочные файлы д ля новых версий стандартных библиотек и для добавляемых возможностей библиотеки, именование этих заголовочных файлов стало проблемой.
Использование старых имен г расширением .Ь породило бы трудности с совместимостью. И было решено для имен стандартных заголовочных файлов отказаться от суффикса .Ь. Он все равно избыточен, поскольку обозначение < > и так указывает, что речь идет об имени стандартного заголовочного файла. Таким образом, стандартная библиотека предоставляет заголовочные файлы без расширения, такие как <1оз1геат> и <тар>, Объявления в этих файлах располагаются в пространстве имен з1с(. Устаревшие заголовочные файлы располагают свои объявления в глобальном пространстве имен и используют расширение уь Рассмотрим пример: и!пс1ис(е<!вв!геат> и! та!и () е!д сви! «Здраествусг, мерка; ) Если в вашей реализации это не удается скомпилировать, попробуйте более традиционную версию: и!пс1иде<!веггеат Ь> т! !па!и (( ( сои! « 'Здравствуй, мирЬ,п"; Несколько самых серьезных проблем с переносимостью возникает из-за непереносимых заголовочных файлов.
Стандартные заголовочные файлы вносят в эту несовместимость лишь малую долю. Часто программы зависят от большого числа заголовочных 998 Приложение Б. Совместимость файлов, которые присутствуют не на всех системах, от болыпого числа объявлений, которые не на всех системах располагаются в тех жс заголовочных файлах, и от объявлений, которые считаются стандартными (поскольку находятся в заголовочных файлах со стандартными именами), но не являются частью какого-либо стандарта.
Вполне удовлетворительных подходов к решению вопросов переносимости перед лицом несогласованности заголовочных файлов не существует. Главная идея состоит в том, чтобы избежать прямых зависимостей от несогласованных заголовочных файлов и локализовать оставшиеся зависимости. То есть мы пытаемся добиться переносимости посредством косвенности и локализации. Например, если нужные нам объявления в разных системах вводятся в разных заголовочных файлах — мы можем включить один специфичный для данной прикладной программы заголовочный файл, который в свою очередь включит соответствующие заголовочные файлы, для каждой системы разные.
Аналогично, если какие-то возможности в разных системах предоставляются в несколько отличной форме, мы можем обращаться к этим средствам через специфичные для прикладной программы интерфейсные классы и функции. Б.3.2. Стандартная библиотека Естественно, реализации С++, предшествовавшие стандарту, могут не иметь некоторых частей стандартной библиотеки. В большинстве из них буду~ потоки ввода/вывода, нешаблонный класс сотр1ех, различные строковые классы и стандартная библиотека С. Однако могут отсутствовать ассощлативные массивы (тар), списки (11з1), оа1аггау и т.
д, В таких случаях пользуйтесь доступными библиотеками (как правило, являющимися собственностью той или иной фирмы), которые бы позволили впоследствии перейти к стандарту при обновлении вашей реализации, Обычно лучше пользоваться нестандартными строками, списками н ассоциативными массивами, чем при отсутствии этих классов в стандартной библиотеке возвращаться к программированию в стиле С. Также досгушзы для свободной загрузки хорошие реализации ЯТЕ-части стандартной библиотеки (главы 16, 17, 18 и 20).