| 15.2 Сводка несовместимостей | |
| 15.3 Анахронизмы | |
| ПредисловиеЯзык формирует наш способ мышления и определяет, о чем мы можем мыслить.Б.Л. ВорфС++ – эт... | 1 |
| Предисловие | 1 |
| Благодарности | 1 |
| Заметки для читателя | 1 |
| Структура этой книги | 1 |
| Замечания по реализации | 1 |
| Упражнения | 1 |
| Замечания по проекту языка | 2 |
| Исторические замечания | 2 |
| Эффективность и структура | 2 |
| Философские замечания | 3 |
| Размышления о программировании на С++ | 3 |
| Правила правой руки | 4 |
| Замечания для программистов на C | 4 |
| Библиографические ссылки | 4 |
| Глава 1 Турне по С++ | 5 |
| Эта глава представляет собой краткий обзор основных черт языка программирования С++. Сначала приводи... | 5 |
| 1.1 Введение | 5 |
| Это турне проведет вас через ряд программ и частей программ на С++. К концу у вас должно сложиться о... | 5 |
| 1.1.1 Вывод | 5 |
| 1.1.2 Компиляция | 5 |
| 1.1.3 Ввод | 5 |
| 1.2 Комментарии | 5 |
| 1.3 Типы и описания | 5 |
| Каждое имя и каждое выражение имеет тип, определяющий операции, которые могут над ними производиться... | 5 |
| 1.3.1 Основные типы | 6 |
| 1.3.2 Производные типы | 6 |
| 1.4 Выражения и операторы | 6 |
| В С++ имеется богатый набор операций, с помощью которых в выражениях образуются новые значения и изм... | 6 |
| 1.4.1 Выражения | 6 |
| 1.4.2 Операторы выражения | 6 |
| 1.4.3 Пустой оператор | 6 |
| 1.4.4 Блоки | 6 |
| 1.4.5 Оператор if | 6 |
| 1.4.6 Операторы switch | 7 |
| 1.4.7 Оператор while | 7 |
| 1.4.8 Оператор for | 7 |
| 1.4.9 Описания | 7 |
| 1.5 Функции | 7 |
| 1.6 Структура программы | 7 |
| 1.7 Классы | 8 |
| 1.8 Перегрузка операций | 8 |
| 1.9 Ссылки | 8 |
| 1.10 Конструкторы | 8 |
| 1.11 Вектора | 9 |
| 1.12 Inline-подстановка | 9 |
| 1.13 Производные классы | 9 |
| 1.14 Еще об операциях | 10 |
| 1.15 Друзья (friend) | 10 |
| 1.16 Обобщенные вектора | 10 |
| 1.17 Полиморфные вектора | 10 |
| 1.18 Виртуальные функции | 11 |
| Глава 2 Описания и константы | 11 |
| В этой главе описаны основные типы (char, int, float и т.д.) и основные способы построения из них но... | 11 |
| 2.1 Описания | 11 |
| Прежде чем имя (идентификатор) может быть использовано в С++ программе, он должно быть описано. Это ... | 11 |
| 2.1.1 Область видимости | 11 |
| 2.1.2 Объекты и адреса (Lvalue) | 12 |
| 2.1.3 Время жизни | 12 |
| 2.2 Имена | 12 |
| 2.3 Типы | 12 |
| Каждое имя (идентификатор) в С++ программе имеет ассоциированный с ним тип. Этот тип определяет, как... | 12 |
| 2.3.1 Основные типы | 12 |
| 2.3.2 Неявное преобразование типа | 13 |
| 2.3.3 Производные типы | 13 |
| 2.3.4 Тип void | 13 |
| 2.3.5 Указатели | 13 |
| 2.3.6 Вектора | 13 |
| 2.3.7 Указатели и вектора | 14 |
| 2.3.8 Структуры | 14 |
| 2.3.9 Эквивалентность типов | 15 |
| 2.3.10 Ссылки | 15 |
| 2.3.11 Регистры | 15 |
| 2.4 Константы | 15 |
| С++ дает возможность записи значений основных типов: символьных констант, целых констант и констант ... | 15 |
| 2.4.1 Целые константы | 16 |
| 2.4.2 Константы с плавающей точкой | 16 |
| 2.4.3 Символьные константы | 16 |
| 2.4.4 Строки | 16 |
| 2.4.5 Ноль | 16 |
| 2.4.6 Const | 16 |
| 2.4.7 Перечисления | 17 |
| 2.5 Экономия пространства | 17 |
| В ходе программирования нетривиальных разработок неизбежно наступает время, когда хочется иметь боль... | 17 |
| 2.5.1 Поля | 17 |
| 2.5.2 Объединения | 17 |
| 2.6 Упражнения | 18 |
| Глава 3 Выражения и операторы | 18 |
| С++ имеет небольшой, но гибкий набор различных видов операторов для контроля потока управления в про... | 18 |
| 3.1 Настольный калькулятор | 18 |
| С операторами и выражениями вас познакомит приведенная здесь программа настольного калькулятора, пре... | 18 |
| 3.1.1 Программа синтаксического разбора | 18 |
| 3.1.2 Функция ввода | 19 |
| 3.1.3 Таблица имен | 20 |
| 3.1.4 Обработка ошибок | 20 |
| 3.1.5 Драйвер | 21 |
| 3.1.6 Параметры командной строки | 21 |
| 3.2 Краткая сводка операций | 21 |
| Операции С++ подробно и систематически описываются в #с. 7 | 21 |
| прочитайте, пожалуйста, этот раздел. Зде... | 21 |
| 3.2.1 Круглые скобки | 22 |
| 3.2.2 Порядок вычисления | 22 |
| 3.2.3 Увеличение и уменьшение* | 22 |
| 3.2.4 Побитовые логические операции | 22 |
| 3.2.5 Преобразование типа | 23 |
| 3.2.6 Свободная память | 23 |
| 3.3 Сводка операторов | 23 |
| Операторы С++ систематически и полностью изложены в #с.9, прочитайте, пожалуйста, этот раздел. А зде... | 24 |
| 3.3.1 Проверки | 24 |
| 3.3.2 Goto | 24 |
| 3.4 Комментарии и выравнивание | 24 |
| 3.5 Упражнения | 25 |
| Глава 4 Функции и файлы | 25 |
| Все нетривиальные программы собираются из нескольких раздельно компилируемых единиц (их принято назы... | 25 |
| 4.1 Введение | 25 |
| 4.2 Компоновка | 26 |
| 4.3 Заголовочные файлы | 26 |
| Типы во всех описаниях одного и того же объекта должны быть согласованными. Один из способов это дос... | 26 |
| 4.3.1 Один заголовочный файл | 27 |
| 4.3.2 Множественные заголовочные файлы | 28 |
| 4.3.3 Сокрытие данных | 28 |
| 4.4 Файлы как модули | 28 |
| 4.5 Как создать библиотеку | 28 |
| 4.6 Функции | 28 |
| Обычный способ сделать что-либо в С++ программе – это вызвать функцию, которая это делает. Определен... | 28 |
| 4.6.1 Описания функций | 28 |
| 4.6.2 Определения функций | 29 |
| 4.6.3 Передача параметров | 29 |
| 4.6.4 Возврат значения | 29 |
| 4.6.5 Векторные параметры | 29 |
| 4.6.6 Параметры по умолчанию | 30 |
| 4.6.7 Перегрузка имен функций | 30 |
| 4.6.8 Незаданное число параметров | 30 |
| Глава 5 Классы | 30 |
| В этой главе описываются возможности определения новых типов в С++, для которых доступ к данным огра... | 30 |
| 5.1 Знакомство и краткий обзор | 31 |
| 5.2 Классы и члены | 31 |
| Класс – это определяемый пользователем тип. Этот раздел знакомит с основными средствами определения ... | 31 |
| 5.2.1 Функции члены | 31 |
| 5.2.2 Классы | 31 |
| 5.2.3 Ссылки на себя | 31 |
| 5.2.4 Инициализация | 32 |
| 5.2.5 Очистка | 32 |
| 5.2.6 Inline | 32 |
| 5.3 Интерфейсы и реализации | 32 |
| Что представляет собой хороший класс? Нечто, имеющее нбольшое и хорошо определенное множество действ... | 32 |
| 5.3.1 Альтернативные реализации | 33 |
| 5.3.2 Законченный класс | 34 |
| 5.4 Друзья и объединения | 34 |
| В это разделе описываются еще некоторые особенности, ксающиеся классов. Показано, как предоставить ф... | 34 |
| 5.4.1 Друзья | 34 |
| 5.4.2 Уточнение* имени члена | 34 |
| 5.4.3 Вложенные классы | 35 |
| 5.4.4 Статические члены | 35 |
| 5.4.5 Указатели на члены | 35 |
| 5.4.6 Структуры и объединения | 35 |
| 5.5 Конструкторы и деструкторы | 35 |
| Если у класса есть конструктор, то он вызывается всегда, когда создается объект класса. Если у класс... | 36 |
| 5.5.1 Предостережение | 36 |
| 5.5.2 Статическая память | 36 |
| 5.5.3 Свободная память | 36 |
| 5.5.4 Объекты класса как члены | 37 |
| 5.5.5 Вектора объектов класса | 37 |
| 5.5.6 Небольшие объекты | 37 |
| 5.5.7 Предостережение | 37 |
| 5.5.8 Объекты переменного размера | 37 |
| 5.6 Упражнения | 38 |
| Глава 6 Перегрузка операций | 38 |
| В этой главе описывается аппарат, предоставляемый в С++ для перегрузки операций. Программист может о... | 38 |
| 6.1 Введение | 38 |
| 6.2 Функции операции | 38 |
| Можно описывать функции, определяющие значения следующих операций:+ – * / % ^ amp | 38 |
| ! ~ ! = « » += -=... | 39 |
| 6.2.1 Бинарные и унарные операции | 39 |
| 6.2.2 Предопределенный смысл операций | 39 |
| 6.2.3 Операции и определяемые пользователем типы | 39 |
| 6.3 Определяемое пользователем преобразование типа | 39 |
| Приведенная во введении реализация комплексных чисел слишком ограничена, чтобы она могла устроить ко... | 39 |
| 6.3.1 Конструкторы | 40 |
| 6.3.2 Операции преобразования | 40 |
| 6.3.3 Неоднозначности | 40 |
| 6.4 Константы | 40 |
| 6.5 Большие объекты | 41 |
| 6.6 Присваивание и инициализация | 41 |
| 6.7 Индексирование | 42 |
| 6.8 Вызов функции | 42 |
| 6.9 Класс String | 42 |
| 6.10 Друзья и члены | 42 |
| 6.11 Предостережение | 43 |
| 6.12 Упражнения | 43 |
| Глава 7 Производные классы | 43 |
| В этой главе описывается понятие производного класса в С ++. Производные классы дают простой, гибкий... | 43 |
| 7.1 Введение | 43 |
| 7.2 Производные классы | 43 |
| Чтобы разделить задачи понимания аппарата языка и метдов его применения, знакомство с понятием произ... | 44 |
| 7.2.1 Построение производного класса | 44 |
| 7.2.2 Функции члены | 44 |
| 7.2.3 Видимость | 45 |
| 7.2.4 Указатели | 45 |
| 7.2.5 Иерархия типов | 45 |
| 7.2.6 Конструкторы и деструкторы | 45 |
| 7.2.7 Поля типа | 46 |
| 7.2.8 Виртуальные функции | 46 |
| 7.3 Альтернативные интерфейсы | 46 |
| После того, как описаны средства языка, которые относяся к производным классам, обсуждение снова мож... | 46 |
| 7.3.1 Интерфейс | 46 |
| 7.3.2 Реализация | 47 |
| 7.3.3 Как этим пользоваться | 47 |
| 7.3.4 Обработка ошибок | 47 |
| 7.3.5 Обобщенные классы | 48 |
| 7.3.6 Ограниченные интерфейсы | 48 |
| 7.4 Добавление к классу | 48 |
| 7.5 Неоднородные списки | 48 |
| 7.6 Законченная программа | 48 |
| Разберем процесс написания программы для рисования на экране геометрических фигур. Она естественным ... | 49 |
| 7.6.1 Администратор экрана | 49 |
| 7.6.2 Библиотека фигур | 50 |
| 7.6.3 Прикладная программа | 50 |
| 7.7 Свободная память | 50 |
| 7.8 Упражнения | 50 |
| Глава 8 Потоки | 50 |
| Язык С++ не обеспечивает средств для ввода/вывода. Ему это и не нужно. Такие средства легко и элеган... | 51 |
| 8.1 Введение | 51 |
| 8.2 Вывод | 51 |
| В этом разделе сначала обсуждаются средства форматного и бесформатного вывода встроенных типов, пото... | 51 |
| 8.2.1 Вывод встроенных типов | 51 |
| 8.2.2 Вывод определяемых пользователем типов | 51 |
| 8.2.3 Некоторые подробности разработки | 52 |
| 8.2.4 Форматированный вывод | 52 |
| 8.2.5 Виртуальная функция вывода | 52 |
| 8.3 Файлы и потоки | 52 |
| Потоки обычно связаны с файлами. Библиотека потоков содает стандартный поток ввода cin, стандартный ... | 53 |
| 8.3.1 Инициализация потоков вывода | 53 |
| 8.3.2 Закрытие потоков вывода | 53 |
| 8.3.3 Открытие файлов | 53 |
| 8.3.4 Копирование потоков | 53 |
| 8.4 Ввод | 53 |
| Ввод аналогичен выводу. Имеется класс istream, который предоставляет операцию »» («взять из») для не... | 53 |
| 8.4.1 Ввод встроенных типов | 54 |
| 8.4.2 Состояния потока | 54 |
| 8.4.3 Ввод типов, определяемых пользователем | 54 |
| 8.4.4 Инициализация потоков ввода | 54 |
| 8.5 Работа со строками | 55 |
| 8.6 Буферизация | 55 |
| 8.7 Эффективность | 55 |
| 8.8 Упражнения | 55 |
| Справочное руководство | 55 |
| 1. Введение | 55 |
| 2. Договоренности о лексике | 55 |
| Есть шесть классов лексем: идентификаторы, ключевые слва, константы, строки, операторы и прочие разд... | 55 |
| 2.1 Комментарии | 55 |
| 2.2 Идентификаторы (имена) | 55 |
| 2.3 Ключевые слова | 55 |
| 2.4 Константы | 55 |
| Как описано ниже, есть несколько видов констант. В #2.6 приводится краткая сводка аппаратных характе... | 56 |
| 2.4.1 Целые константы | 56 |
| 2.4.2 Явно заданные длинные константы | 56 |
| 2.4.3 Символьные константы | 56 |
| 2.4.4 Константы с плавающей точкой | 56 |
| 2.4.5 Перечислимые константы | 56 |
| 2.4.6 Описанные константы | 56 |
| 2.5 Строки | 56 |
| 2.6 Харктеристики аппаратного обеспечения | 56 |
| 3. Запись синтаксиса | 56 |
| 4. Имена и типы | 56 |
| Имя обозначает(денотирует) объект, функцию, тип, значние или метку. Имя вводится в программе описани... | 56 |
| 4.1 Область видимости | 56 |
| 4.2 Определения | 56 |
| 4.3 Компоновка | 57 |
| 4.4 Классы памяти | 57 |
| 4.5 Основные типы | 57 |
| 4.6 Производные типы | 57 |
| 5. Объекты и Lvalue (адреса) | 57 |
| 6. Преобразования | 57 |
| Определенные операции могут в зависимости от их операдов вызывать преобразование значения операнда о... | 57 |
| 6.1 Символы и целые | 57 |
| 6.2 Float и Double | 57 |
| 6.3 Плавающие и целые | 57 |
| 6.4 Указатели и целые | 57 |
| 6.5 Unsigned | 58 |
| 6.6 Арифметические преобразования | 58 |
| 6.7 Преобразования указателей | 58 |
| 6.8 Преобразования ссылок | 58 |
| 7. Выражения | 58 |
| Приоритет операций в выраженях такой же, как и порядок главных подразделов в этом разделе, наибольши... | 58 |
| 7.1 Основные выражения | 58 |
| 7.2 Унарные операции | 59 |
| Выражения с унарными операциями группируют справа налво:унарное_выражение: унарная_операция выражени... | 59 |
| 7.2.1 Увеличение и уменьшение | 59 |
| 7.2.2 Sizeof | 59 |
| 7.2.3 Явное преобразование типа | 59 |
| 7.2.4 Свободная память | 59 |
| 7.3 Мультипликативные операции | 60 |
| 7.4 Аддитивные операции | 60 |
| 7.5 Операции сдвига | 60 |
| 7.6 Операции отношения | 60 |
| 7.7 Операции равенства | 60 |
| 7.8 Операция побитовое И | 60 |
| 7.9 Операция побитовое исключающее ИЛИ | 60 |
| 7.10 Операция побитовое включающее ИЛИ | 60 |
| 7.11 Операция логическое И | 60 |
| 7.12 Операция логическое ИЛИ | 60 |
| 7.13 Условная операция | 60 |
| 7.14 Операции присваивания | 61 |
| 7.15 Операция запятая | 61 |
| 7.16 Перегруженные операции | 61 |
| Большинство операций может быть перегружено, то есть, описано так, чтобы они получали в качестве опе... | 61 |
| 7.16.1 Унарные операции | 61 |
| 7.16.2 Бинарные операции | 61 |
| 7.16.3 Особые операции | 61 |
| 8. Описания | 61 |
| Описания используются для определения интерпретации, дваемой каждому идентификатору. Они не обязател... | 61 |
| 8.1 Спецификаторы класса памяти | 61 |
| 8.2 Спецификаторы типа | 61 |
| 8.3 Описатели | 61 |
| 8.4 Смысл описателей | 62 |
| Каждый описатель считается утверждением того, что если в выражении возникает конструкция, имеющаяя т... | 62 |
| 8.4.1 Примеры | 63 |
| 8.4.2 Массивы, указатели и индексирование | 63 |
| 8.5 Описания классов | 63 |
| Класс есть тип. Его имя становится typedef-имя (см. #8.8), которое может быть использовано даже внут... | 63 |
| 8.5.1 Статические члены | 63 |
| 8.5.2 Функции члены | 63 |
| 8.5.3 Производные классы | 63 |
| 8.5.4 Виртуальные функции | 64 |
| 8.5.5 Конструкторы | 64 |
| 8.5.6 Преобразования | 64 |
| 8.5.7 Деструкторы | 64 |
| 8.5.8 Свободная память | 64 |
| 8.5.9 Видимость имен членов | 64 |
| 8.5.10 Друзья | 64 |
| 8.5.11 Функция операция | 65 |
| 8.5.12 Структуры | 65 |
| 8.5.13 Объединения | 65 |
| 8.5.14 Поля бит | 65 |
| 8.5.15 Вложенные классы | 65 |
| 8.6 Инициализация | 65 |
| Описатель может задавать начальное значение описываемого идентификатора.инициализатор: = выражение =... | 65 |
| 8.6.1 Список инициализаторов | 66 |
| 8.6.2 Объекты классов | 66 |
| 8.6.3 Ссылки | 66 |
| 8.6.4 Массивы символов | 66 |
| 8.7 Имена типов | 66 |
| 8.8 Typedef – определение типа | 66 |
| 8.9 Перегруженные имена функций | 67 |
| 8.10 Описания перечислений | 67 |
| 8.11 Описание Asm | 67 |
| 9. Операторы | 67 |
| Операторы выполняются последовательно во всех случаях кроме особо оговоренных.... | 67 |
| 9.1 Оператор выражение | 67 |
| 9.2 Составной оператор, или блок | 67 |
| 9.3 Условный оператор | 67 |
| 9.4 Оператор While | 67 |
| 9.5 Оператор Do | 67 |
| 9.6 Оператор For | 67 |
| 9.7 Оператор Switch | 67 |
| 9.8 Оператор Break | 67 |
| 9.9 Оператор Continue | 67 |
| 9.10 Оператор Return | 67 |
| 9.11 Оператор Goto | 67 |
| 9.12 Помеченные операторы | 68 |
| 9.13 Пустой оператор | 68 |
| 9.14 Оператор описание | 68 |
| 10. Определения функций | 68 |
| 11. Командные строки компилятора | 68 |
| Компилятор содержит препроцессор, способный выполнять макроподстановки, условную компиляцию и включе... | 68 |
| 11.1 Замена лексем | 68 |
| 11.2 Включение файлов | 69 |
| 11.3 Условная компиляция | 69 |
| 11.4 Управление строкой | 69 |
| 12. Константные выражения | 69 |
| 13. Соображения мобильности | 69 |
| 14. Краткое изложение синтаксиса | 69 |
| Эта краткая сводка синтаксиса С++ предназначается, чтобы способствовать пониманию. Она не является т... | 69 |
| 14.1 Выражения | 69 |
| 14.2 Описания | 70 |
| 14.3 Операторы | 70 |
| 14.4 Внешние определения | 70 |
| 14.5 Препроцессор | 70 |
| 15. Отличия от C | 70 |
| 15.1 Расширения | 70 |
С++ – это универсальный язык программирования, задуманный так, чтобы сделать программирование более приятным для серьезного программиста. За исключением второстепенных деталей С++ является надмножеством языка программирования C. Помимо возможностей, которые дает C, С++ предоставляет гибкие и эффективные средства определения новых типов. Используя определения новых типов, точно отвечающих концепциям приложения, программист может разделять разрабатываемую программу на легко поддающиеся контролю части. Такой метод построения программ часто называют абстракцией данных. Информация о типах содержится в некоторых объектах типов, определенных пользователем. Такие объекты просты и надежны в использовании в тех ситуациях, когда их тип нельзя установить на стадии компиляции. Программирование с применением таких объектов часто называют объектно-ориентированным. При правильном использовании этот метод дает более короткие, проще понимаемые и легче контролируемые программы.Ключевым понятием С++ является класс. Класс – это тип, определяемый пользователем. Классы обеспечивают сокрытие данных, гарантированную инициализацию данных, неявное преобразование типов для типов, определенных пользователем, динамическое задание типа, контролируемое пользователем управление памятью и механизмы перегрузки операций. С++ предоставляет гораздо лучшие, чем в C, средства выражения модульности программы и проверки типов. В языке есть также усовершенствования, не связанные непосредственно с классами, включающие в себя символические константы, inline-подстановку функций, параметры функции по умолчанию, перегруженные имена функций, операции управления свободной памятью и ссылочный тип. В С++ сохранены возможности языка C по работе с основными объектами аппаратного обеспечения (биты, байты, слова, адреса и т.п.). Это позволяет весьма эффективно реализовывать типы, определяемые пользователем.С++ и его стандартные библиотеки спроектированы так, чтобы обеспечивать переносимость. Имеющаяся на текущий момент реализация языка будет идти в большинстве систем, поддерживающих C. Из С++ программ можно использовать C библиотеки, и с С++ можно использовать большую часть инструментальных средств, поддерживающих программирование на C.Эта книга предназначена главным образом для того, чтобы помочь серьезным программистам изучить язык и применять его в нетривиальных проектах. В ней дано полное описание С++, много примеров и еще больше фрагментов программ.