Стандартный Си++
Покупка
Тематика:
Программирование на C и C++
Издательство:
Финансы и статистика
Автор:
Подбельский Вадим Валериевич
Год издания: 2022
Кол-во страниц: 688
Дополнительно
Вид издания:
Учебное пособие
Уровень образования:
ВО - Бакалавриат
ISBN: 978-5-00184-081-7
Артикул: 108986.03.99
Содержит доступное для начинающего программиста описание соответствующего международному стандарту языка Си++, его стандартной библиотеки и входящей в нее библиотеки шаблонов STL.
Материал пособия позволяет изучить синтаксис и семантику базовых конструкций языка, а также механизмы и возможности стандартной библиотеки. На многочисленных примерах программ разъясняются наиболее тонкие и трудные вопросы процедурного, объектного, объектно-ориентированного и обобщенного программирования с помощью средств языка Си++ и его библиотеки.
Для студентов вузов, учащихся колледжей и специализированных школ. Может использоваться в качестве самоучителя и справочного пособия.
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 01.03.04: Прикладная математика
- 09.03.01: Информатика и вычислительная техника
- 09.03.02: Информационные системы и технологии
- 09.03.03: Прикладная информатика
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов
В.В. ПОДБЕЛЬСКИЙ СТАНДАРТНЫЙ Си++ Допущено Учебно-методическим объединением по образованию в области прикладной математики и управления качеством в качестве учебного пособия для студентов высших учебных заведений, обучающихся по направлению подготовки 230400 «Прикладная математика» ФИНАНСЫ И СТАТИСТИКА МОСКВА 2022
УДК 004.438(075.8) ББК 32.973.26-018.1.я73 П44 РЕЦЕНЗЕНТЫ: кафедра «Системы обработки информации и управления» Московского государственного технического университета им. Н.Э. Баумана; С.М. Лавренов, кандидат технических наук, доцент Подбельский В.В. П44 Стандартный Си++: учеб. пособие / В.В. Подбельский. — М.: Финансы и статистика, 2022. — Режим доступа: https:// finstat.ru/wp-content/uploads/2022/11/Podbelskiy_Standartnyi-C-plus-plus.pdf, ограниченный. — Загл. с экрана. — 688 с.: ил. ISBN 978-5-00184-081-7 Содержит доступное для начинающего программиста описание соответствующего международному стандарту языка Си++, его стандартной библиотеки и входящей в нее библиотеки шаблонов STL. Материал пособия позволяет изучить синтаксис и семантику базовых конструкций языка, а также механизмы и возможности стандартной библиотеки. На многочисленных примерах программ разъясняются наиболее тонкие и трудные вопросы процедурного, объектного, объектно-ориентированного и обобщенного программирования с помощью средств языка Си++ и его библиотеки. Для студентов вузов, учащихся колледжей и специализированных школ. Может использоваться в качестве самоучителя и справочного пособия. УДК 004.438(075.8) ББК 32.973.26-018.1.я73 © Подбельский В.В., 2008, 2022 © ООО «Издательство «Финансы ISBN 978-5-00184-081-7 и статистика», 2022
Оглавление Предисловие............................................ 7 Глава 1. Неформальное введение в Си++................. 13 I.I. Первая программа на языке Си++............. 13 1.2. Пространство имен и стандартные заголовки.. 17 1.3. Программа с вводом данных в цикле.......... 20 1.4. Строки в языке Си++........................ 22 Глава 2. Лексические основы языка Си++................ 25 2.1. Общие сведения о программах, лексемах и алфавите..................................... 25 2.2. Идентификаторы и служебные слова........... 27 2.3. Константы-литералы и перечисления.......... 28 2.4. Знаки операций............................. 42 2.5. Разделители................................ 60 Глава 3. Скалярные типы и выражения................... 67 3.1. Базовые и производные типы................. 67 3.2. Объекты и их атрибуты...................... 73 3.3. Определения и описания..................... 94 3.4. Выражения и преобразования типов.......... 101 Глава 4. Операторы языка Си++........................ 111 4.1. Последовательно выполняемые операторы...... 111 4.2. Операторы выбора (ветвления).............. 113 4.3. Операторы цикла........................... 118 4.4. Операторы передачи управления............. 124 Глава 5. Адреса, указатели, массивы.................. 131 5.1. Указатели и адреса объектов................ 131 5.2. Адресная арифметика, типы указателей и операции над ними........................... 137 5.3. Массивы и указатели....................... 150 5.4. Многомерные массивы, массивы указателей, динамические массивы.......................... 162 Глава 6. Функции, указатели, ссылки.................. 177 6.1. Определения, описания и вызовы функций..... 177 6.2. Функции с переменным количеством параметров (аргументов).................................. 185 6.3. Рекурсивные функции....................... 192
Оглавление 6.4. Подставляемые (inline-) функции......... 196 6.5. Функции и массивы....................... 198 6.6. Указатели на функции.................... 209 6.7. Ссылки.................................. 223 6.8. Перегрузка функций...................... 235 Глава 7. Препроцессорныесредства................... 239 7.1. Стадии и команды препроцессорной обработки .... 239 7.2. Замены в тексте......................... 241 7.3. Включение текстов из файлов............. 245 7.4. Условная компиляция..................... 246 7.5. Макроподстановки средствами препроцессора.... 249 7.6. Препроцессорные операции и дополнительные директивы..................... 254 7.7. Встроенные (предопределенные) макроимена..... 256 Гл а в а 8. Структуры и объединения................ 260 8.1. Структура как совокупность данных....... 260 8.2. Объединения разнотипных данных.......... 270 8.3. Битовые поля структур и объединений..... 275 Глава 9. Класс как абстрактный тип................. 282 9.1. Класс как расширение понятия структуры....... 282 9.2. Конструкторы, деструкторы и статусы доступа.. 290 9.3. Поля данных и методы класса............. 302 9.4. Указатель this........................ 315 9.5. Друзья классов.......................... 320 Глава 10. Библиотечный класс string................ 328 10.1. Строки в языках Си и Си++.............. 328 10.2. Конструкторы класса string............. 329 10.3. Операции над строками.................. 330 10.4. Методы класса string................... 333 10.4.1. Доступ к символу, конкатенация, присваивание ......................... 333 10.4.2. Размеры строк................... 334 10.4.3. Вставки, удаления, замены частей строк.... 337 10.4.4. Поиск в строке и извлечение подстрок. 339 10.4.5. Сравнение строк и их частей..... 345 10.4.6. Обращение к данным объекта класса string 347 10.4.7. Массивы строк и обмены значениями строк 349 10.5. Консольный ввод-вывод строк и обмены с файлами.................................... 350
Оглавление 5 Глава 11. Перегрузка операций и классы ресурсоемких объектов............................................ 356 I l.l. Расширение действия (перегрузка) стандартных операций.................................. 356 П.2. Изменение интерфейса существующего класса.... 369 П.З. Классы ресурсоемких объектов............ 372 Глава 12. Исключения............................... 383 12.1. Общие сведения об исключениях...‘...... 383 12.2. Синтаксис и семантика механизма исключений................................... 389 12.3. Исключения в конструкторах............. 396 Глава 13. Включение и наследование классов......... 398 13.1. Отношение включения классов............ 398 13.2. Общие сведения о наследовании в Си++.... 401 13.3. Синтаксис наследования и доступность компонентов.................................. 406 13.4. Множественное наследование и виртуальные классы....................................... 413 13.5. Локальные классы....................... 417 Глава 14. Специальные методы классов и перегрузка операций при наследовании........................... 419 14.1. Методы при наследовании классов........ 419 14.2. Присваивание при наследовании.......... 420 14.3. Конструкторы при наследовании.......... 424 14.4. Деструкторы при наследовании........... 428 14.5. Перегрузка операций при наследовании.... 428 14.6. Принцип подстановки и его реализация на языке Си++................................ 432 14.7. Наследование и ресурсоемкие классы..... 437 Глава 15. Виртуальные функции и абстрактные классы.... 443 15.1. Виртуальные функции.................... 443 15.2. Присваивания при наследовании.......... 446 15.3. Деструкторы при наследовании........... 450 15.4. Реализация виртуальных функций......... 452 15.5. Абстрактные классы..................... 455 15.6. Массивы и списки указателей на абстрактные классы....................................... 462 Глава 16. Шаблоны функций и классов................ 467 16.1. Шаблоны функций........................ 467 16.2. Явная специализация шаблонной функции... 478 16.3. Шаблоны классов........................ 480
Оглавление 16.4. Внешнее определение методов и дружественные функции шаблонных классов.................... 484 16.5. Специализации шаблонов классов......... 492 16.6. Частичная пользовательская специализация..... 498 16.7. Объекты и массивы объектов шаблонных классов 501 Глава 17. Механизмы, использованные при построении STL...................................... 509 17.1. Краткие сведения о STL................. 509 17.2. Шаблоны функций и обобщенные алгоритмы....... 510 17.3. Контейнеры и итераторы................. 515 17.4. Взаимодействие средств STL с контейнерами и алгоритмами пользователя................... 528 Глава 18. Основные средства библиотеки STL......... 533 18.1. О концепции построения STL............. 533 I8.2. Контейнеры STL......................... 534 18.3. Основные методы контейнеров............ 537 18.4. Итераторы в STL........................ 547 18.5. Функциональные объекты (функторы)...... 550 18.6. Алгоритмы STL.......................... 554 Гл а в а 19. Стандартная библиотека и ввод-вывод......... 564 19.1. Обзор стандартной библиотеки Си++...... 564 19.2. Ввод-вывод в языке Си++................ 568 19.3. Форматирование данных при обменах с потоками 575 19.4. Функции для обмена с потоками.......... 583 19.5. Работа с файлами....................... 587 Приложения......................................... 597 Приложение I. Разработка консольных приложений в среде Microsoft Visual Studio.Net 2005. 597 Приложение 2. Константы предельных значений........... 610 Приложение 3. Таблицы кодов..................... 612 Приложение 4. Вывод на консоль русского текста........ 619 Приложение 5. Методы класса string.............. 622 Приложение 6. Стандартные функции библиотеки Си....... 632 Приложение 7. Алгоритмы STL..................... 638 Приложение 8. Средства ввода-вывода в Си++...... 650 Приложение 9. Комплексные числа в Си++.......... 659 Приложение 10. Свободно распространяемый компилятор DJGPP......................... 662 Библиографический список........................... 667 Указатель символов................................. 670 Предметный указатель............................... 672
Предисловие В настоящее время Си++ является языком, наиболее полно представляющим основные парадигмы современного программирования. С его помощью можно писать процедурно-ориентированные программы и создавать библиотеки функций. Си++ поддерживает объектно-ориентированное программирование и позволяет разрабатывать библиотеки классов. Механизм шаблонов языка Си++ и его стандартная библиотека дают возможность создавать программы, применяя методы обобщенного программирования. В то же время язык Си++ дает возможность программисту "находиться" наиболее близко к аппаратным средствам той платформы, на которой исполняется программа. В программе на Си++ можно динамически управлять памятью, использовать адресную арифметику, обращаться к отдельным разрядам двоичного представления данных и т. д. Язык Си++ постоянно развивается и совершенствуется в общем русле эволюции средств программирования и информатики в целом. Назовем наиболее значимые события этого процесса. • В библиотеку языка Си++ была включена стандартная библиотека шаблонов (STL - Standard Template Library), что "кардинально изменило всю библиотеку" и возможности базового языка в целом. • В 1998 г. вышел международный стандарт языка Си++ ISO/IEC 14882. (С 2003 г. действует вторая редакция этого стандарта 2003-10-15: ISO/IEC/ANSI/IT1.) • Мировое сообщество фирм, создающих программное обеспечение, разработало несколько компиляторов языка Си++, соответствующих международному стандарту Си++. Компиляторы языка Си++ разработаны практически для всех аппаратно-программных платформ. Программы, написанные на языке Си++, транслируются в исполняемые модули, работающие под управлением операционных систем UNIX (и ее разновидностей, таких, как, LINUX, Solaris), Windows, Mac OS. В отличие от С#, Java и Visual Basic язык Си++ позволяет создавать программы, для выполнения которых не требуется устанавливать
Предисловие на компьютер специальное программное обеспечение, создающее среду исполнения программ. Интересно отметить следующий факт. Наиболее современная разработка фирмы Microsoft - Visual Studio.NET включает компиляторы нескольких языков: Си++, С#, JScript, Visual Basic, J#. Для каждого из названных языков соответствующий компилятор создает так называемый управляемый модуль (manager module). Особенность такого модуля состоит в том, что он не может исполняться на том компьютере, на котором не установлены специальные программные средства - "общеязыковая исполняющая среда". И только для языка Си++ сделано исключение - текст программы на языке Си++ в Visual Studio.NET может транслироваться и в управляемый модуль, и в традиционный исполняемый модуль (ехе-модуль). А традиционный ехе-модуль не требует присутствия на компьютере специальной среды исполнения. С учетом вышеизложенного на основе опыта преподавания и применения языка Си++ написано данное пособие. Материал излагается таким образом, что начинающий программист, начав с элементов языка, может профессионально освоить самые трудные и самые современные средства Си++ и его стандартной библиотеки. В книге девятнадцать глав и десять приложений. Глава 1 содержит примеры, позволяющие познакомиться с общей схемой подготовки и выполнения программ на языке Си++. В главе 2 рассматриваются лексические основы языка, используемые в дальнейшем на протяжении всей книги. Глава 3 посвящена объектам (переменным), их определениям, описаниям и использованиям в выражениях. При изучении выражений внимание уделено не только операциям языка Си++, но и особенностям преобразований типов. В главе 4 рассмотрены операторы, т. е. конструкции, определяющие логику (порядок) выполнения действий в программе. Этот материал традиционен для алгоритмических языков и обычно не вызывает затруднений при изучении. Глава 5 потребует от начинающего программиста значительных усилий. Адресная арифметика и указатели - это одна из фундаментальных и трудных тем языка Си и его наследника Си++.
Предисловие 9 Рассмотрены связи массивов с указателями, а также показано, как с помощью массивов указателей моделируются многомерные массивы с динамически задаваемыми размерами. В главе 6 изучаются функции и их взаимоотношение с другими языковыми конструкциями: указателями, массивами, ссылками. Вводятся понятия сигнатуры функции и процедурного полиморфизма (перегрузки функций). Глава 7 подробно рассматривает препроцессорные механизмы. В последнее время им незаслуженно мало уделяется внимания в пособиях по Си++. Однако в ряде случаев именно препроцессор дает возможность получить элегантные решения, недоступные без его применения. Примером служит макрос для вывода изображения и значения выражения, использованного в качестве аргумента макроса. Глава 8 готовит читателя к изучению классов. Здесь изучены частные случаи классов - классы без методов, т.е. структуры и объединения. Именно в таком виде они унаследованы из языка Си. Особое внимание уделено размещению структур и объединений в памяти, а также их битовым полям. В главе 9 рассмотрен вводимый программистом структурированный тип, действия над объектами которого выполняются с помощью методов класса. Особое внимание уделено конструкторам и деструктору, а также специальному указателю this. Глава 10 знакомит читателя со строками в стиле Си++. Подробно описаны методы класса string, при использовании которого каждый символ строки имеет тип char. Методы сгруппированы по их функциональным назначениям. Далее приведены стандартные функции для ввода и вывода строк, а также базовые сведения по обменам с файлами в текстовом режиме. В главе 11 рассматривается перегрузка операций и показана особая роль дружественных функций в этом механизме. Здесь же вводится понятие "ресурсоемкие объекты" и показано, как для их классов определять конструкторы копирования и выполнять перегрузку операции присваивания. Глава 12 посвящена уникальному механизму управления ходом выполнения программы — исключениям. Показано, как определять класс исключений, как генерировать (посылать) исключения, как их перехватывать (ловить), обрабатывать и ретранслировать.
Предисловие В главе 13 рассмотрены два отношения между классами: включение и наследование. Подробно изучаются перегрузка операций при наследовании и особенности наследования классов ресурсоемких объектов. Глава 14 продолжает тему наследования классов и посвящена методам при наследовании. Особое внимание уделено правилам определения при наследовании специальных методов: конструкторов умолчания, конструкторов копирования, деструкторов и операций-функций присваивания. Показано, как нужно организовывать в Си++ наследование классов, чтобы для их объектов выполнялся принцип подстановки Лискова. Глава 15 знакомит читателя с понятиями статического и динамического типов указателей и ролью виртуальных функций в обеспечении динамического связывания. Показано, как определять виртуальные функции, и объясняется, почему деструктор рекомендуется делать виртуальным методом. Объясняются причины появления в Си++ чисто виртуальных функций и абстрактных классов. Глава 16 посвящена шаблонам. Цель их появления в языке -обеспечить параметризованное определение функций и классов. Описаны конструкции для определений шаблонов и средства для получения их специализаций. Показаны различия между типизирующими и не типизирующими параметрами шаблонов. Рассмотрены особенности определения методов и дружественных функций шаблонных классов. Материал этой главы необходим для понимания механизмов STL. Глава 17 начинается с объяснения принципов, положенных в основу построения STL. Вводится понятие последовательности, затем показано, как определить обобщенный алгоритм, контейнер, итератор. Основная цель — научить читателя определять собственные контейнеры, которые можно использовать с алгоритмами STL, и алгоритмы, которые можно применять к контейнерам STL. Глава 18 посвящена контейнерам, алгоритмам и итераторам STL. Подчеркивается, что контейнеры не связаны между собой (нет общего базового класса контейнеров), но каждый реализует все стандартные контейнерные интерфейсы. Рассмотрены последовательные и ассоциативные контейнеры, приведены их методы и итераторы, делающие их доступными для алгоритмов STL. Далее показано, как определять конкретные экземпляры контейне