ebook img

Язык программирования C++ PDF

337 Pages·1.452 MB·Russian
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Язык программирования C++

www.samouchiteli.ru Мюррэй Хилл, Нью Джерси Бьярн Страустрап Язык C++ Сергей Деревяго. C++ 3rd: комментарии Содержание 1 Предисловие 8 Благодарности 8 Заметки для читателя 10 Структура этой книги 10 Замечания по реализации 11 Упражнения 11 Замечания по проекту языка 11 Исторические замечания 12 Эффективность и структура 13 Философские замечания 15 Размышления о программировании на C++ 15 Правила правой руки 17 Замечания для программистов на C 17 Глава 1 Турне по C++ 18 1.1 Введение 18 1.1.1 Вывод 18 1.1.2 Компиляция 19 1.1.3 Ввод 20 1.2 Комментарии 21 1.3 Типы и Описания 21 1.3.1 Основные Tипы 21 1.3.2 Производные Типы 23 1.4 Выражения и Операторы 23 1.4.1 Выражения 23 1.4.2 Операторы Выражения 24 1.4.3 Пустой оператор 24 1.4.4 Блоки 24 1.4.5 Операторы if 25 1.4.6 Операторы switch 25 1.4.7 Оператор while 26 1.4.8 Оператор for 26 1.4.9 Описания 27 1.5 Функции 27 1.6 Структура программы 28 1.7 Классы 30 1.8 Перегрузка операций 31 1.9 Ссылки 32 1.10 Конструкторы 33 1.11 Вектора 34 1.12 Inline-подстановка 35 1.13 Производные классы 36 1.14 Еще об операциях 37 1.15 Друзья (friend) 39 1.16 Обобщенные Вектора 40 1.17 Полиморфные Вектора 40 1.18 Виртуальные функции 42 Глава 2 Описания и Константы 43 2.1 Описания 43 2.1.1 Область Видимости 44 2.1.2 Объекты и Адреса (Lvalue) 46 2.1.3 Время Жизни 46 2.2 Имена 47 2.3 Типы 47 2.3.1 Основные Типы 48 2.3.2 Неявное Преобразование Типа 49 2.3.3 Производные Типы 50 2.3.4 Тип void 51 2.3.5 Указатели 51 2.3.6 Вектора 52 2.3.7 Указатели и Вектора 54 2.3.8 Структуры 55 2.3.9 Эквивалентность типов 57 2.3.10 Ссылки 58 2.3.11 Регистры 60 2.4 Константы 61 2.4.1 Целые Константы 61 2.4.2 Константы с Плавающей Точкой 62 2.4.3 Символьные Константы 62 2.4.4 Строки 63 2.4.5 Ноль 64 2.4.6 Const 64 2.4.7 Перечисления 65 2.5 Экономия Пространства 66 2.5.1 Поля 66 2.5.2 Объединения 67 2.6 Упражнения 69 Глава 3 Выражения и операторы 71 3.1 Настольный калькулятор 71 3.1.1 Программа синтаксического разбора 71 3.1.2 Функция ввода 76 3.1.3 Таблица имен 78 3.1.4 Обработка ошибок 80 3.1.5 Драйвер 81 3.1.6 Параметры командной строки 82 3.2 Краткая сводка операций 83 3.2.1 Круглые скобки 85 3.2.2 Порядок вычисления 85 3.2.2 Увеличение и уменьшение* 86 3.2.4 Побитовые логические операции 87 3.2.5 Преобразование типа 88 3.2.6 Свободная память 89 3.3 Сводка операторов 92 3.3.1 Проверки 93 3.3.2 Goto 95 3.4 Комментарии и Выравнивание 96 3.5 Упражнения 97 Глава 4 Функции и Файлы 100 4.1 Введение 100 4.2 Компоновка 101 4.3 Заголовочные Файлы 102 4.3.1 Один Заголовочный Файл 104 4.3.2 Множественные Заголовочные Файлы 107 4.3.3 Скрытие Данных 109 4.4 Файлы как Модули 110 4.5 Как Создать Библиотеку 111 4.6 Функции 112 4.6.1 Описания Функций 112 4.6.2 Определения Функций 112 4.6.3 Передача Параметров 113 4.6.4 Возврат Значения 114 4.6.5 Векторные Параметры 115 4.6.6 Параметры по Умолчанию 116 4.6.7 Перегрузка Имен Функций 117 4.6.8 Незаданное Число Параметров 119 4.6.9 Указатель на Функцию 120 4.7 Макросы 124 4.8 Упражнения 125 Глава 5 Классы 128 5.1 Знакомство и краткий обзор 128 5.2 Классы и Члены 129 5.2.1 Функции Члены 129 5.2.2 Классы 130 5.2.3 Ссылки на Себя 131 5.2.4 Инициализация 132 5.2.5 Очистка 134 5.2.6 Inline 135 5.3 Интерфейсы и Реализации 135 5.3.1 Альтернативные Реализации 136 5.3.2 Законченный Класс 139 5.4 Друзья и Объединения 142 5.4.1 Друзья 142 5.4.2 Уточнение* Имени Члена 144 5.4.3 Вложенные Классы 144 5.4.4 Статические Члены 145 5.4.5 Указатели на Члены 146 5.4.6 Структуры и Объединения 147 5.5 Конструкторы и Деструкторы 149 5.5.1 Предостережение 150 5.5.2 Статическая Память 150 5.5.3 Свободная Память 152 5.5.4 Объекты Класса и Члены 152 5.5.5 Вектора Объектов Класса 154 5.5.6 Небольшие Объекты 155 5.5.7 Предостережение 156 5.5.8 Объекты Переменного Размера 157 5.6 Упражнения 158 Глава 6 Перегрузка Операций 160 6.1 Введение 160 6.2 Функции Операции 161 6.2.1 Бинарные и Унарные Онерации 161 6.2.2 Предопределенные Значения Операций 162 6.2.3 Операции и Определяемые Пользователем Типы 162 6.3 Определяемое Преобразование Типа 163 6.3.1 Конструкторы 164 6.3.2 Операции Преобразования 164 6.3.3 Неоднозначности 166 6.4 Константы 167 6.5 Большие Объеты 167 6.6 Присваивание и Инициализация 168 6.7 Индексирование 170 6.8 Вызов Функции 172 6.9 Класс Строка 173 6.10 Друзья и Члены 177 6.11 Предостережение 177 6.12 Упражнения 178 Глава 7 Производные Классы 181 7.1 Введение 181 7.2 Производные Классы 182 7.2.1 Построение Производного Класса 182 7.2.2 Функции Члены 183 7.2.3 Видимость 184 7.2.4 Указатели 186 7.2.5 Иерархия Типов 187 7.2.6 Конструкторы и Деструкторы 187 7.2.7 Поля Типа 188 7.2.8 Виртуальные Функции 190 7.3 Альтернативные Интерфейсы 192 7.3.1 Интерфейс 192 7.3.2 Реализация 193 7.3.3 Как Этим Пользоваться 194 7.3.4 Обработка Ошибок 196 7.3.5 Обобщенные Классы 197 7.3.6 Ограниченные Интерфейсы 199 7.4 Добавление к Классу 199 7.5 Неоднородные Списки 201 7.6 Законченна Программа 201 7.6.1 Администратор Экрана 201 7.6.2 Библиотека Фигур 203 7.6.3 Прикладная Программа 207 7.7 Свободная Память 209 7.8 Упражнения 210 Глава 8 Потоки 212 8.1 Введение 212 8.2 Вывод 213 8.2.1 Вывод Встроенных Типов 213 8.2.2 Вывод Типов, Определяемых Пользователем 214 8.2.3 Некоторые Подробности Разработки 214 8.2.4 Форматированный Вывод 216 8.2.5 Виртуальная Функция Вывода 218 8.3 Файлы и Потоки 219 8.3.1 Инициализация Потоков Вывода 219 8.3.2 Закрытие Потоков Вывода 220 8.3.3 Открытие Файлов 220 8.3.4 Копирование Потоков 221 8.4 Ввод 221 8.4.1 Ввод Встроенных Типов 221 8.4.2 Состояния Потока 223 8.4.3 Ввод Типов, Определяемых Пользователем 224 8.4.4 Инициализация Потоков Ввода 225 8.5 Работа со Строками 226 8.6 Буферизация 226 8.7 Эффективность 228 8.8 Упражнения 228 1. ВВЕДЕНИЕ 230 2. ДОГОВОРЕННОСТИ О ЛЕКСИКЕ 230 2.1 Комментарии 230 2.2 Идентификаторы (имена) 230 2.3 Ключевые слова 230 2.4 Константы 231 2.4.1 Целые константы 231 2.4.2 Явно заданные длинные константы 231 2.4.3 Символьные константы 231 2.4.4 Константы с плавающей точкой 232 2.4.5 Перечислимые константы 232 2.4.6 Описанные константы 232 2.5 Строки 232 2.6 Харктеристики аппаратного обеспечения 232 3. ЗАПИСЬ СИНТАКСИСА 233 4. ИМЕНА И ТИПЫ 233 4.1 Область видимости 234 4.2 Определения 234 4.3 Компоновка 234 4.4 Классы памяти 235 4.5 Основные типы 236 4.4 Производные типы 236 5. ОБЪЕКТЫ И LVALUE(АДРЕСА) 237 6. ПРЕОБРАЗОВАНИЯ 237 6.1 Символы и целые 237 6.2 Float и double 237 6.3 Плавающие и целые 237 6.4 Указатели и целые 238 6.5 Unsigned 238 6.6 Арифметические преобразования 238 6.7 Преобразования указателей 239 6.8 Преобразования ссылок 239 7. ВЫРАЖЕНИЯ 239 7.1 Основные выражения 240 7.2 Унарные операции 241 7.2.1 Увеличение и Уменьшение 242 7.2.2 Sizeof 242 7.2.3 Явное Преобразование Типа 243 7.2.4 Свободная Память 243 7.3 Мультипликативные операции 244 7.4 Аддитивные операции 244 7.5 Операции сдвига 245 7.6 Операции отношения 245 7.7 Операции равенства 246 7.8 Операция побитовое И 246 7.9 Операция побитовое исключающее ИЛИ 246 7.10 Операция побитовое включающее ИЛИ 246 7.11 Операция логическое И 246 7.12 Операция логическое ИЛИ 246 7.13 Условная операция 247 7.14 Операции присваивания 247 7.15 Операция запятая 247 7.16 Перегруженные операции 248 7.16.1 Унарные операции 248 7.16.2 Бинарные операции 248 7.16.3 Особые операции 248 8. ОПИСАНИЯ 249 8.1 Спецификаторы класса памяти 249 8.2 Спецификаторы Типа 250 8.3 Описатели 251 8.4 Смысл описателей 252 8.4.1 Примеры 254 8.5 Описания классов 256 8.5.1 Статические члены 257 8.5.2 Функции члены 257 8.5.3 Производные классы 259 8.5.4 Виртуальные функции 259 8.5.5 Конструкторы 260 8.5.6 Преобразования 261 8.5.7 Деструкторы 261 8.5.8 Видимость имен членов 261 8.5.9 Друзья (friends) 262 8.5.10 Функция операция 263 8.5.11 Структуры 263 8.5.12 Объединения 263 8.5.13 Поля бит 263 8.5.14 Вложенные классы 264 8.6 Инициализация 264 8.6.1 Список инициализаторов 265 8.6.2 Классовые объекты 266 8.6.3 Ссылки 266 8.6.4 Массивы символов 267 8.7 Имена типов 267 8.8 Определение типа typedef 268 8.9 Перегруженные имена функций 269 8.10 Описание перечисления 270 8.11 Описание Asm 270 9. ОПЕРАТОРЫ 271 9.1 Оператор выражение 271 9.2 Составной оператор, или блок 271 9.3 Условный оператор 271 9.4 Оператор while 271 9.5 Оператор do 272 9.6 Оператор for 272 9.7 Оператор switch 273 9.8 Оператор break 273 9.9 Оператор continue 274 9.10 Оператор return 274 9.11 Оператор goto 274 9.12 Помеченные операторы 274 9.13 Пустой оператор 274 9.14 Оператор delete 275 9.15 Оператор asm 275 10. ВНЕШНИЕ ОПРЕДЕЛЕНИЯ 275 10.1 Определения функций 275 10.2 Определения внешних данных 276 11. ПРАВИЛА ОБЛАСТИ ВИДИМОСТИ 276 12. КОМАНДНЫЕ СТРОКИ КОМПИЛЯТОРА 276 12.1 Замена идентификаторов 277 12.2 Включение файлов 277 12.3 Условная компиляция 277 12.4 Управление строкой 278 13. НЕЯВНЫЕ ОПИСАНИЯ 278 14. ОБЗОР ТИПОВ 278 14.1 Классы 278 14.2 Функции 278 14.3 Массивы, указатели и индексирование 279 14.4 Явные преобразования указателей 279 15. КОНСТАНТНЫЕ ВЫРАЖЕНИЯ 280 16. СООБРАЖЕНИЯ МОБИЛЬНОСТИ 281 17. СВОБОДНАЯ ПАМЯТЬ 281 18. КРАТКОЕ ИЗЛОЖЕНИЕ СИНТАКСИСА 282 18.1 Выражения 282 18.2 Описания 283 18.3 Операторы 285 18.4 Внешние определения 286 18.5 Препроцессор 286 19. ОТЛИЧИЯ ОТ "СТАРОГО C" 286 19.1 Расширения 286 Предисловие Язык формирует наш способ мышления и определяет, о чем мы можем мыслить. Б.Л. Ворф C++ - универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. За исключением второстепенных деталей C++ является надмножеством языка программирования C. Помимо возможностей, которые дает C, C++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на легко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. Такие объекты просты и надежны в использовании в тех ситуациях, когда их тип нельзя установить на стадии компиляции. Программирование с применением таких объектов часто называют объектно-ориентированным. При правильном использовании этот метод дает более короткие, проще понимаемые и легче контролируемые программы. Ключевым понятием C++ является класс. Класс - это тип, определяемый пользователем. Классы обеспечивают скрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций. C++ предоставляет гораздо лучшие, чем в C, средства выражнения модульности программы и проверки типов. В языке есть также усовершенствования, не связанные непосредственно с классами, включающие в себя символические константы, inline- подстановку функций, параметры функции по умолчанию, перегруженные имена функций, операции управления свободной памятью и ссылочный тип. В C++ сохранены возможности языка C по работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем. C++ и его стандартные библиотеки спроектированы так, чтобы обеспечивать переносимость. Имеющаяся на текущий момент реализация языка будет идти в большинстве систем, поддерживающих C. Из C++ программ можно использовать C библиотеки, и с C++ можно использовать большую часть инструментальных средств, поддерживающих программирование на C. Эта книга предназначена главным образом для того, чтобы помочь серьезным программистам изучить язык и применять его в нетривиальных проектах. В ней дано полное описание C++, много примеров и еще больше фрагментов программ. Благодарности C++ никогда бы не созрел без постоянного использования, предложений и конструктивной критики со стороны многих друзей и - стр 9 - коллег. Том Карджил, Джим Коплин, Сту Фельдман, Сэнди Фрэзер, Стив Джонсон, Брайэн Керниган, Барт Локанти, Дуг МакИлрой, Дэннис Риччи, Лэрри Рослер, Джерри Шварц и Джон Шопиро подали важные для развития языка идеи. Дэйв Пресотто написал текущую реализацию библиотеки потоков ввода/вывода. Кроме того, в развитие C++ внесли свой вклад сотни людей, которые присылали мне предложения по усовершенствованию, описания трудностей, с которыми они сталкивались, и ошибки компилятора. Здесь я могу упомянуть лишь немногих из них: Гэри Бишоп, Эндрю Хьюм, Том Карцес, Виктор Миленкович, Роб Мюррэй, Леони Росс, Брайэн Шмальт и Гарри Уокер. В издании этой книги мне помогли многие люди, в частности, Джон Бентли, Лаура Ивс, Брайэн Керниган, Тэд Ковальски, Стив Махани, Джон Шопиро и участники семинара по C++, который проводился в Bell Labs, Колумбия, Огайо, 26-27 июня 1985 года. Мюррэй Хилл, Нью Джерси Бьярн Страустрап Заметки для читателя "О многом,"-молвил Морж,-"Пришла пора поговорить." Л. Кэррол В этой главе содержится обзор книги, список библиографических ссылок и некоторые замечания по C++ вспомогательного характера. Замечания касаются истории C++, идей, оказавших влияние на разработку C++, и мыслей по поводу программирования на C++. Эта глава не является введением: замечания не обязательны для понимания последующих глав, и некоторые из них предполагают знание C++. Структура этой книги Глава 1 - это короткое турне по основным особенностям C++, предназначенное для того, чтобы дать читателю почувствовать язык. Программисты на C первую половину главы могут прочитать очень быстро; она охватывает главным образом черты, общие для C и C++. Во второй главе описаны средства определения новых типов в C++; начинающие могут отложить более подробное изучение этого до того, как прочтут Главы 2, 3 и 4. В Главах 2, 3 и 4 описываются средства C++, не включенные в определение новых типов: основные типы, выражения и структуры управления в C++ программах. Другими словами, в них описывается подмножество C++, которое по существу является языком C. Рассмотрение в них проводится гораздо подробнее, но полную информацию можно найти только в справочном руководстве. В Главах 5, 6 и 7 описываются средства C++ по описанию новых типов, особенности языка, не имеющие эквивалента в C. В Главе 5 приводится понятие базового класса, и показывается, как можно инициализировать объекты типа, определенного пользователем, обращаться к ним и, наконец, убирать их. В Главе 6 объясняется, как для определенного пользователем типа определять унарные и бинарные операции, как задавать преобразования между типами, определенными пользователем, и как как задавать то, каким образом должно обрабатываться каждое создание, уничтожение и копирование значения определенного пользователем типа. Глава 7 описывает концепцию производных классов, которая позволяет программисту строить более сложные классы из более простых, обеспечивать альтернативные интерфейсы класса и работать с объектами безопасным и не требующим беспокоиться о типе способом в тех ситуациях, когда типы объектов не могут быть известны на стадии компиляции. В Главе 8 представлены классы ostream и istream, предоставляемые стандартной библиотекой для осуществления ввода-вывода. Эта глава имеет двоякую цель: в ней представлены полезные средства, что одновременно является реальным примером использования C++. И, наконец, в книгу включено справочное руководство по C++. Ссылки на различные части этой книги даются в форме #2.3.4 (Глава 2 подраздел 3.4). Глава с - это справочное руководство; например, #с.8.5.5. - стр 11 - Замечания по реализации Во время написания этой книги все реализации C++ использовали версии единственного интерфейсного компилятора#. Он используется на многих архитектурах, включая действующие версии системы операционной системы UNIX на AT&T 3B, DEC VAX, IBM 370 и Motorolla 68000. Фрагменты программ, которые приводятся в этой книге, взяты непосредственно из исходных файлов, которые компилировались на 3B в UNIX System V версии 2 [15], VAX11/750 под 8-ой Редакцией UNIX [16] и CCI Power 6/32 под BSD4.2 UNIX [17]. Язык, описанный в этой книге, - это "чистый C++", но имеющиеся на текущий момент компиляторы реализуют большое число "анахронизмов" (описанных в #с.15.3), которые должны способствовать переходу от C к C++. Упражнения Упражнения находятся в конце глав. Все упражнения главным образом типа напишите-программу. Для решения всегда пишите такую прогармму, которая будет компилироваться и работать по меньшей мере на нескольких тестовых случаях. Упражнения различаются в основном по сложности, поэтому они помечены оценкой степени сложности. Шкала экспоненциальная, так что если на упражение (*1) вам потребовалось пять минут, то упражнение (*2) вам может потребоваться час, а на (*3) - день. Время, которое требуется на то, чтобы написать и оттестировать программу, зависит больше от опыта читателя, нежели от самого упражения. Упражнение (*1) может отнять день, если для того, чтобы запустить ее, читателю сначала придется знакомиться с

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.