C++20 для программистов - Пол Дейтел - E-Book

C++20 для программистов E-Book

Пол Дейтел

0,0

Beschreibung

Программисты с опытом работы на других языках высокого уровня смогут на практике освоить современный С++ и «большую четверку» его новых возможностей: диапазоны, концепты, модули и корутины. 200+ практических примеров реального исходного кода позволят быстро овладеть идиомами современного С++, используя популярные компиляторы: Visual C++®, GNU® g++, Apple® Xcode® и LLVM®/Clang. Знание базы позволит перейти к контейнерам стандартной библиотеки С++ array и vector; функциональному программированию с диапазонами и представлениями C++20; строкам, файлам и регулярным выражениям; объектно-ориентированному программированию с классами, наследованием, динамическим и статическим полиморфизмом; перегрузке операторов, семантике копирования и перемещения, RAII и умным указателям; исключениям и ожидаемым в С++23 контрактам; контейнерам, итераторам и алгоритмам стандартной библиотеки; шаблонам, концептам С++20 и метапрограммированию; модулям С++ 20 и технологии разработки больших программ; конкурентности, параллелизму, параллельным алгоритмам стандартной библиотеки С++17 и С++20 и корутинам С++20.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern
Kindle™-E-Readern
(für ausgewählte Pakete)

Seitenzahl: 1527

Veröffentlichungsjahr: 2024

Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:

Android
iOS
Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Переводчики В. Здобнов, М. Фатеев

Пол Дейтел, Харви Дейтел

C++20 для программистов. — СПб.: Питер, 2024.

ISBN 978-5-4461-2359-9

© ООО Издательство "Питер", 2024

Оглавление

Предисловие
Современный C++
Кому пригодится эта книга
Готовые файлы с исходным кодом программ
Три профессиональных компилятора на выбор
Учебный метод готовых объектов
Краткое содержание книги
Дополнительные материалы на сайте deitel.com
C++ Core Guidelines
Профессиональные статические анализаторы кода
Интернет-ресурсы для программистов
Docker
Некоторые ключевые документы и ресурсы по C++
Сайты, где ответят на ваши вопросы
Благодарности
Об авторах
От издательства
Перед началом работы
1. Введение и тест-драйв популярных бесплатных компиляторов C++
1.1. Введение
1.2. Тест-драйв: компиляция приложения, написанного на C++20
1.3. Закон Мура, многоядерные процессоры и многопоточное программирование
1.4. Что такое объектно-ориентированное программирование?
1.5. Итоги
2. Азы программирования на C++
2.1. Введение
2.2. Первая программа на C++: вывод текста на экран
2.3. Модификация нашей первой программы на C++
2.4. Вторая программа на C++: сложение целых чисел
2.5. Арифметические операторы
2.6. Принятие решений: операторы равенства и сравнения
2.7. Готовые объекты: создание и использование объектов класса string стандартной библиотеки
2.8. Итоги
3. Управляющие инструкции (часть 1)
3.1. Введение
3.2. Управляющие структуры
3.3. Инструкция одиночного выбора if
3.4. Инструкция двойного выбора if...else
3.5. Инструкция цикла while
3.6. Цикл со счетчиком
3.7. Цикл с контрольным значением
3.8. Вложенные управляющие инструкции
3.9. Составные операторы присваивания
3.10. Операторы инкремента и декремента
3.11. Несовместимость основных типов данных на разных платформах
3.12. Готовые объекты: работа с целыми числами произвольной величины
3.13. Форматирование текста функцией format
3.14. Итоги
4. Управляющие инструкции (часть 2)
4.1. Введение
4.2. Как работает цикл со счетчиком
4.3. Инструкция цикла for
4.4. Инкремент и декремент счетчика в цикле for
4.5. Программа для вычисления суммы четных чисел
4.6. Программа для расчета сложных процентов
4.7. Инструкция цикла do...while
4.8. Инструкция множественного выбора switch
4.9. Инструкции выбора с инициализаторами
4.10. Инструкции break и continue
4.11. Логические операторы
4.12. Типичные ошибки при работе с операторами равенства (==) и присваивания (=)
4.13. Готовые объекты: создание и чтение ZIP-файлов
4.14. Форматирование текста с указанием ширины полей и точности
4.15. Итоги
5. Функции и шаблоны функций
5.1. Введение
5.2. Функции и классы — основные компоненты программ
5.3. Функции математической библиотеки
5.4. Определения функций и прототипы функций
5.5. Порядок вычисления аргументов функции
5.6. Дополнительные сведения о прототипах функций и принудительном приведении аргументов
5.7. Заголовки стандартной библиотеки C++
5.8. Генерация случайных чисел
5.9. Программа «Игра в кости» и знакомство с перечислениями
5.10. Правила областей видимости
5.11. Встроенные функции
5.12. Ссылки и ссылочные параметры
5.13. Аргументы по умолчанию
5.14. Оператор разрешения области видимости
5.15. Перегрузка функций
5.16. Шаблоны функций
5.17. Рекурсия
5.18. Пример рекурсивных вычислений: числа Фибоначчи
5.19. Рекурсия или итерация?
5.20. Lnfylun Lhqtomh Wjtz Qarcv: Qjwazkrplm xzz Xndmwwqhlz
5.21. Итоги
6. Массивы, векторы, библиотека ranges и функциональное программирование
6.1. Введение
6.2. Массивы
6.3. Объявление массива
6.4. Инициализация массива в цикле
6.5. Инициализация массива со списком инициализаторов
6.6. Цикл for для диапазона значений (C++11) и цикл for для диапазона значений с инициализатором (C++20)
6.7. Заполнение массива и спецификатор constexpr
6.8. Суммирование элементов массива
6.9. Визуализация данных массива на простой диаграмме
6.10. Использование элементов массива в качестве счетчиков
6.11. Использование массива для подсчета результатов опроса
6.12. Сортировка массива и поиск в массиве
6.13. Многомерные массивы
6.14. Основы функционального программирования
6.15. Готовые объекты: шаблон класса vector стандартной библиотеки C++
6.16. Итоги
7. Указатели в современном C++ (фактор риска)
7.1. Введение
7.2. Объявление и инициализация указателей
7.3. Операторы для работы с указателями
7.4. Передача аргументов по указателю
7.5. Традиционные массивы в стиле C
7.6. Функция to_array (C++20), преобразующая традиционные массивы в std::array
7.7. Использование const с указателями и данными, на которые они указывают
7.8. Оператор sizeof
7.9. Выражения и арифметические операции с указателями
7.10. Готовые объекты: доступ к контейнерам через span (C++20)
7.11. Строки на основе указателей
7.12. Другие темы, связанные с указателями
7.13. Итоги
8. Строки и их представления, текстовые файлы, CSV-файлы и регулярные выражения
8.1. Введение
8.2. Присваивание и конкатенация строк
8.3. Сравнение строк
8.4. Создание подстроки
8.5. Обмен значениями двух строк
8.6. Получение характеристик строки
8.7. Поиск подстрок и символов в строке
8.8. Замена и удаление символов в строке
8.9. Вставка символов в строку
8.10. Преобразования между числами и строками (C++11)
8.11. Представления string_view (C++17)
8.12. Файлы и потоки
8.13. Создание файла с последовательным доступом
8.14. Чтение данных из файла с последовательным доступом
8.15. Чтение и запись текста в кавычках (C++14)
8.16. Обновление данных в файле с последовательным доступом
8.17. Обработка строковых потоков
8.18. Необработанные строковые литералы
8.19. Готовые объекты: чтение и анализ CSV-файла с данными о катастрофе «Титаника»
8.20. Готовые объекты: основы регулярных выражений
8.21. Итоги
9. Пользовательские классы
9.1. Введение
9.2. Тест-драйв объекта пользовательского класса Account
9.3. Класс Account с элементом данных, set-функцией и get-функцией
9.4. Конструктор класса Account
9.5. Разработка программ с set-функциями и get-функциями
9.6. Добавление «денежной» переменной в класс Account
9.7. Отделение интерфейса от реализации на примере класса Time
9.8. Процесс компиляции и компоновки программы
9.9. Область видимости класса и доступ к элементам класса
9.10. Функции доступа и служебные функции
9.11. Конструкторы с аргументами по умолчанию
9.12. Деструкторы
9.13. Вызов конструкторов и деструкторов
9.14. Коварная ловушка: возврат ссылки или указателя на скрытый элемент данных
9.15. Оператор присваивания по умолчанию
9.16. Константные объекты и константные функции класса
9.17. Композиция: объекты как элементы классов
9.18. Дружественные функции и классы
9.19. Указатель this
9.20. Статические элементы класса: данные и функции, общие для всех объектов класса
9.21. Агрегаты
9.22. Готовые объекты: сериализация в формате JSON
9.23. Итоги
10. ООП: наследование и динамический полиморфизм
10.1. Введение
10.2. Базовые и производные классы
10.3. Взаимосвязь между базовым и производным классами
10.4. Конструкторы и деструкторы в производных классах
10.5. Принцип динамического полиморфизма на примере объектов в видеоигре
10.6. Отношения между объектами в иерархии наследования
10.7. Виртуальные функции и виртуальные деструкторы
10.8. Абстрактные классы и чистые виртуальные функции
10.9. Полиморфизм в программе расчета зарплаты
10.10. Динамический полиморфизм, виртуальные функции и динамическое связывание «под капотом» компилятора
10.11. Идиома невиртуального интерфейса
10.12. Наследование интерфейса вместо наследования реализации
10.13. Полиморфизм на основе шаблона класса std::variant и функции std::visit
10.14. Множественное наследование
10.15. Защищенные элементы класса
10.16. Открытое, защищенное и скрытое наследование
10.17. Другие методы динамического полиморфизма и статический полиморфизм
10.18. Итоги
11. Перегрузка операторов, семантика копирования и перемещения, умные указатели
11.1. Введение
11.2. Перегруженные операторы класса string стандартной библиотеки
11.3. Основные принципы перегрузки операторов
11.4. Управление динамической памятью с помощью операторов new и delete
11.5. Современные методы управления динамической памятью в C++: RAII и умные указатели
11.6. Создание класса myArray с перегрузкой операторов
11.7. Оператор трехстороннего сравнения (C++20)
11.8. Преобразования между типами
11.9. Конструкторы и конвертирующие операторы со спецификатором explicit
11.10. Перегрузка оператора вызова функции
11.11. Итоги
12. Исключения и обзор контрактного программирования
12.1. Введение
12.2. Поток управления при обработке исключения
12.3. Гарантии безопасности исключений и noexcept
12.4. Повторная генерация исключений
12.5. Размотка стека и необработанные исключения
12.6. Когда надо обрабатывать исключения
12.7. Конструкторы, деструкторы и обработка исключений
12.8. Обработка исключений оператора new
12.9. Иерархия исключений стандартной библиотеки
12.10. Альтернатива блоку finally в языке C++: RAII («получение ресурсов есть инициализация»)
12.11. Библиотеки, поддерживающие и исключения, и коды ошибок
12.12. Журнал ошибок
12.13. Основы контрактного программирования
12.14. Итоги
13. Контейнеры и итераторы стандартной библиотеки
13.1. Введение
13.2. Основы контейнеров
13.3. Работа с итераторами
13.4. Несколько слов об алгоритмах для обработки контейнеров
13.5. Последовательные контейнеры
13.6. Последовательный контейнер vector
13.7. Последовательный контейнер list
13.8. Последовательный контейнер deque
13.9. Ассоциативные контейнеры
13.10. Адаптеры контейнеров
13.11. Псевдоконтейнер bitset
13.12. Основы нотации «O-большое»
13.13. Основы хеш-таблиц
13.14. Итоги
14. Алгоритмы стандартной библиотеки, диапазоны и представления C++20
14.1. Введение
14.2. Требования алгоритмов: концепты (C++20)
14.3. Лямбда-выражения и алгоритмы
14.4. Алгоритмы
14.5. Функциональные объекты (функторы)
14.6. Проекции
14.7. Представления (C++20) и функциональное программирование
14.8. Основы параллельных алгоритмов
14.9. Краткое описание алгоритмов стандартной библиотеки
14.10. Диапазоны в C++23
14.11. Итоги
15. Шаблоны, концепты (C++20) и метапрограммирование
15.1. Введение
15.2. Пользовательские шаблоны классов и статический полиморфизм
15.3. Расширения функциональности шаблонов, введенные в C++20
15.4. Концепты (C++20): первый взгляд
15.5. Признаки типов
15.6. Концепты: детальное рассмотрение
15.7. Тест-драйв концептов с помощью объявления static_assert
15.8. Создание пользовательского алгоритма
15.9. Создание пользовательского контейнера и пользовательских итераторов
15.10. Аргументы по умолчанию для параметров-типов шаблона
15.11. Шаблоны переменных
15.12. Вариативные шаблоны и выражения свертки
15.13. Метапрограммирование на основе шаблонов
15.14. Итоги
16. Модули (C++20): технология разработки больших программ
16.1. Введение
16.2. Компиляция и компоновка до C++20
16.3. Преимущества и предназначение модулей
16.4. Пример перехода на модули: заголовочные единицы трансляции
16.5. Модули могут уменьшать размеры единиц трансляции и время компиляции
16.6. Пример: создание и использование модуля
16.7. Глобальный фрагмент модуля
16.8. Отделение интерфейса от реализации
16.9. Разделы модуля
16.10. Дополнительные примеры работы с модулями
16.11. Перенос кода в модули
16.12. Будущее модулей и инструментов для работы с ними
16.13. Итоги
Приложение: видео про модули
Приложение: статьи про модули
Приложение: глоссарий по модулям
17. Параллельные алгоритмы и конкурентность: высокоуровневый подход
17.1. Введение
17.2. Параллельные алгоритмы стандартной библиотеки (C++17)
17.3. Многопоточное программирование
17.4. Запуск задач с помощью std::jthread
17.5. Отношения между производителем и потребителем: первый эксперимент
17.6. Синхронизация доступа производителя и потребителя к общим изменяемым данным
17.7. Производитель и потребитель: минимизация ожидания с помощью кольцевого буфера
17.8. Читатели и писатели
17.9. Кооперативное прерывание потоков класса jthread
17.10. Запуск задач с помощью шаблона функции std::async
17.11. Однократная потокобезопасная инициализация
17.12. Основы атомарных типов
17.13. Координация потоков с помощью защелок и барьеров (C++20)
17.14. Семафоры (C++20)
17.15. C++23: взгляд в будущее конкурентности
17.16. Итоги
18. Корутины (C++20)
18.1. Введение
18.2. Библиотеки поддержки корутин
18.3. Установка библиотек concurrencpp и generator
18.4. Создание корутины-генератора с помощью библиотеки generator
18.5. Запуск задач с помощью библиотеки concurrencpp
18.6. Создание корутины, содержащей co_await и co_return
18.7. Низкоуровневые концепции корутин
18.8. Развитие корутин в C++23
18.9. Итоги
Приложение А. Приоритеты и группировка операторов
Приложение Б. Набор символов
Рекомендуем прочитать

Предисловие

Добро пожаловать в «C++20 для программистов. Метод готовых объектов». В этой книге представлены передовые информационные технологии для разработчиков программного обеспечения. Она соответствует стандарту C++20 (1834 страницы), который был утвержден Комитетом ISO по стандартам C++ в сентябре 2020 года1, 2.

Язык программирования C++ используется для создания высокопроизводительного, критически важного и надежного программного обеспечения. На нем пишут операционные системы, системы реального времени, встраиваемое ПО, видеоигры, банковское ПО, системы управления авиатранспортом, системы связи и многие другие программы. Эта книга представляет собой учебное пособие вводного и среднего уровня, предназначенное для освоения языка C++ (в том числе его стандартной библиотеки) в версии C++20, которая относится к самым популярным в мире языкам программирования. Мы представляем наглядный, современный, насыщенный примерами кода, ориентированный на практические задачи вводный курс C++20. Из этого предисловия вы узнаете о сути нашей книги.

1 Финальный проект стандарта C++ опубликован по адресу https://timsong-cpp.github.io/cppwp/n4861. Эта версия бесплатна. Официальную версию в печатном виде (ISO/IEC 14882:2020) можно приобрести по адресу https://www.iso.org/standard/79358.html.

2 Херб Саттер (Herb Sutter), «C++20 Approved, C++23 Meetings and Schedule Update», 6 сен­тября 2020 г. Был доступен: 15 сентября 2023 г. https://herbsutter.com/2020/09/06/c20-approved-c23-meetings-and-schedule-update.

Современный C++

В центре внимания — современный C++, включающий четыре последних стандарта: C++20, C++17, C++14 и C++11. Мы также упоминаем основные дополнения, которые могут появиться в C++23 или в более поздних версиях. Общей темой этой книги является акцент на новых, усовершенствованных способах написания кода на C++. Мы используем лучшие практики, делая акцент на современных идиомах современного профессионального программирования на C++, а также уделяем большое внимание вопросам производительности, безопасности и проектирования программного обеспечения.

В курсе событий

«Кто дерзает учить, должен никогда не переставать учиться»3. (Дж. К. Дана)

Чтобы «почувствовать пульс» современного языка C++, меняющего многие методы работы программистов, мы изучили около 6000 актуальных статей, исследовательских работ, технических описаний, документов, постов в блогах и форумах, а также видеопубликаций.

3 Джон Коттон Дана (John Cotton Dana). «В 1912 г. Дана, библиотекарь из Ньюарка, получил просьбу подобрать латинскую цитату для надписи на новом здании Государственного колледжа Ньюарка (ныне Университет Кин) в Юнионе (штат Нью-Джерси). Не найдя подходящей цитаты, Дана сочинил фразу, ставшую девизом колледжа. The New York Times Book Review, 5 марта 1967 г., с. 55. https://www.bartleby.com/73/1799.html.

Кому пригодится эта книга

Книга «C++20 для программистов. Метод готовых объектов» рассчитана на следующие целевые аудитории:

• разработчики программ на C++, которые хотят изучить новейшие возможности C++20 по подробному учебнику, написанному в профессиональном стиле;

• разработчики программ на других языках, которые готовятся к выполнению проекта на языке C++ и хотят изучить его актуальную версию;

• разработчики, которые изучали C++ в вузе или работали с ним много лет назад, а теперь хотят освежить свои знания в контексте C++20;

• профессиональные преподаватели C++, составляющие курсы по C++20.

Готовые файлы с исходным кодом программ

В основе книги лежит фирменный подход Deitel — реальный код. Вместо отдельных фрагментов кода мы показываем язык C++ таким, каким он должен быть, на сотнях практических примеров готового кода, то есть работающих программ и выводимых ими данных.

Прочитайте раздел «Перед началом работы», который следует за этим предисловием, чтобы узнать, как подготовить свой компьютер с операционной системой Windows, macOS или Linux к выполнению более 200 приведенных в книге примеров кода, в которых около 15 тысяч строк. Для вашего удобства все эти примеры опубликованы на нашем веб-сайте и на портале GitHub в виде стандартных файлов C++ с расширениями .cpp и .h. Вы можете бесплатно загрузить их по любому из адресов4:

• https://github.com/pdeitel/cplusplus20forprogrammers

• https://www.deitel.com/books/c-plus-plus-20-for-programmers

• https://deitel.com/c-plus-plus-20-for-programmers

• https://deitel.com/cpp20fp

Все эти файлы готовы для компиляции как в интегрированных средах разработки, так и в компиляторах командной строки. Подробные инструкции о том, как компилировать и выполнять примеры кода с помощью трех рекомендуемых нами компиляторов, вы найдете в главе 1, в разделе 1.2. Компилируйте и запускайте соответствующие программы во время чтения книги, чтобы сделать учебный процесс более наглядным. Если у вас возникнут проблемы, вы можете связаться с нами по адресу:

[email protected]

4 А также с сайта издательства «Питер», см. раздел «От издательства». — Примеч. ред.

Три профессиональных компилятора на выбор

Мы протестировали все приведенные в книге примеры кода в последних версиях трех компиляторов:

• Visual C++® в составе интегрированной среды разработки Microsoft® Visual Studio® Community Edition — в операционной системе Windows®;

• Clang C++ (clang++) в составе интегрированной среды разработки Apple® Xcode® — в операционной системе macOS®, а также в контейнере Docker®;

• GNU® C++ (g++) — в операционной системе Linux®, а также в контейнере Docker® с установленным пакетом GNU Compiler Collection (GCC).

Когда мы писали эту книгу, почти все языковые новшества, введенные в стандарт C++20, уже были полностью реализованы во всех трех компиляторах, некоторые — только в одном или двух и лишь немногие — ни в одном из трех. Мы указываем на эти различия при необходимости и будем обновлять наш цифровой контент по мере того, как эти новшества будут внедряться производителями компиляторов. Мы также будем публиковать обновления кода в репозитории этой книги на портале GitHub:

https://github.com/pdeitel/CPlusPlus20ForProgrammers

Кроме того, мы будем публиковать обновления кода и текста на веб-странице этой книги:

https://www.deitel.com/books/c-plus-plus-20-for-programmers

Учебный метод готовых объектов

В главе 9 мы расскажем о том, как разрабатывать на языке C++20 пользовательские (то есть ваши собственные) классы, а в последующих главах продолжим рассмотрение объектно-ориентированного программирования.

Что такое готовые объекты?

В первых главах вы будете работать с уже существующими классами, выполняющими достаточно сложные задачи. Используя всего несколько простых инструкций на языке C++, вы быстро создадите объекты этих классов и заставите их «показать свою силу». Мы называем это методом готовых объектов.

Учитывая огромное количество бесплатных библиотек классов с открытым исходным кодом (open-source), созданных сообществом разработчиков C++, вы сможете выполнять сложные задачи задолго до того, как научитесь создавать свои собственные классы в главе 9. Это один из наиболее привлекательных аспектов работы с объектно-ориентированными языками, особенно с таким совершенным объектно-ориентированным языком, как C++.

Бесплатные классы

Мы обращаем ваше внимание, что в «экосистеме» C++ есть огромное количество очень полезных и совершенно бесплатных классов, доступных программистам. Основными источниками этих классов являются:

• стандартная библиотека C++;

• библиотеки, специфичные для конкретной платформы, например поставляемые с Microsoft Windows, Apple macOS или различными версиями Linux;

• бесплатные сторонние библиотеки C++, создаваемые сообществом разработчиков открытого программного обеспечения;

• коллеги-программисты, например сотрудники вашей организации.

Мы рекомендуем вам черпать вдохновение для ваших собственных программ, изучая многочисленные общедоступные программы на языке C++, публикуемые в виде открытого исходного кода на таких сайтах, как GitHub.

Проект Boost

Проект Boost предоставляет программистам 168 библиотек C++ с открытым исходным кодом5. Кроме того, в нем «выращиваются» многие языковые новшества, которые впоследствии включаются в стандартную библиотеку C++. Например, именно из проекта Boost берут начало уже вошедшие в современный C++ средства многопоточности и генерации случайных чисел, интеллектуальные указатели, кортежи, регулярные выражения, файловые системы и класс string_view6. На этой странице сайта Stack Overflow приведен список биб­лиотек и языковых средств современного C++, которые эволюционировали из библиотек Boost7:

https://stackoverflow.com/a/8852421

Примеры кода с готовыми объектами

В главе 1 кратко рассматриваются основные понятия и термины объектной технологии. В главах 2–8 вы будете создавать и использовать объекты уже существующих классов (задолго до создания своих собственных классов в главе 9 и далее). Наши примеры кода с готовыми объектами посвящены следующим учебным темам:

• Раздел 2.7 — создание и использование объектов класса string стандартной библиотеки.

• Раздел 3.12 — работа с очень большими целыми числами.

• Раздел 4.13 — создание и чтение ZIP-файлов.

• Раздел 5.20 — Lnfylun Lhqtomh Wjtz Qarcv: Qjwazkrplm xzz Xndmwwqhlz (это зашифрованная фраза, речь идет о шифровании с закрытым ключом).

• Раздел 6.15 — шаблон класса vector стандартной библиотеки C++.

• Раздел 7.10 — доступ к контейнерам с данными с помощью класса span (C++20).

• Раздел 8.19 — чтение и анализ CSV-файла со статистическими данными о катастрофе «Титаника».

• Раздел 8.20 — основы регулярных выражений.

• Раздел 9.22 — сериализация данных в формате JSON (JavaScript Object Nota­tion).

Прекрасный пример метода готовых объектов — использование объектов таких стандартных классов C++, как array и vector (глава 6). Вы можете работать с ними, даже не зная, как они устроены, и вообще не умея писать пользовательские классы. На протяжении всей книги мы используем обширные возможности стандартной библиотеки C++.

5 «Boost 1.78.0 Library Documentation». Был доступен: 15 сентября 2023 г. https://www.boost.org/doc/libs/1_78_0.

6 «Boost (C++ libraries)». Был доступен: 15 сентября 2023 г. https://en.wikipedia.org/wiki/Boost_(C++_libraries).

7 Kennytm, ответ на вопрос «Which Boost Features Overlap with C++11?». Был доступен: 15 сентября 2023 г. https://stackoverflow.com/a/8852421.

Краткое содержание книги

На внутренней стороне обложки книги показана в виде наглядной схемы ее модульная структура. Читая раздел «Краткое содержание книги», сверяйтесь с этой схемой, которая поможет быстрее ознакомиться с темами глав и разделов.

В первых главах книги закладывается прочный фундамент основ языка C++20. Последующие главы с более сложными практическими примерами кода помогут вам перейти к разработке ваших собственных программ на C++20. На протяжении всей книги рассматриваются пять моделей программирования на C++20:

• процедурное программирование;

• функциональное программирование;

• объектно-ориентированное программирование;

• обобщенное программирование;

• метапрограммирование на основе шаблонов.

Часть 1. Быстрый старт и базовые возможности C++

Глава 1 «Введение и тест-драйв популярных бесплатных компиляторов C++» рассказывает о том, что должен знать каждый профессиональный программист. В этой главе вы найдете:

• краткое введение;

• обсуждение закона Мура, многоядерных процессоров и необходимости стандартизированного конкурентного программирования в современном C++;

• краткую справку по объектно-ориентированному программированию с объяснением терминов, которые встретятся вам в последующих главах.

В этой главе вы также узнаете, как компилировать и выполнять написанный на C++ готовый код с помощью трех бесплатных компиляторов, которые мы вам рекомендуем:

• Visual C++ из Microsoft Visual Studio (в Windows);

• Apple Xcode (в macOS);

• GNU g++ (в Linux).

Мы проверили на каждом из них все приведенные в книге примеры кода, прокомментировав те немногие случаи, когда наши версии компиляторов (существующие на момент выхода книги в 2022 году) еще не поддерживают какие-либо из новшеств стандарта C++20. Выберите ту среду разработки программ, которая вам больше нравится. Наши примеры кода будут хорошо работать и с другими компиляторами C++20.

Мы расскажем, как запускать компиляторы командной строки GNU g++ и clang++ в контейнерах Docker, чтобы вы могли работать с самыми современными версиями этих компиляторов в любой из трех операционных систем: Windows, macOS или Linux. Docker — это ценный инструмент разработчика, дополнительные сведения о нем приведены в разделе «Перед началом работы». Кроме того, мы расскажем, как установить Linux на компьютер с Windows, используя подсистему Windows для Linux (WSL). Это еще один способ работы в Windows с компиляторами g++ и clang++.

В главе 2 «Азы программирования на C++» представлены базовые понятия языка C++, такие как ввод и вывод данных, основные типы данных, арифметические операторы и их приоритеты, инструкции принятия решений. В разделе 2.7 вы познакомитесь с методом готовых объектов, легко создавая и используя объекты класса string стандартной библиотеки (для этого вам не надо знать, как устроен этот большой и сложный класс и как вообще устроены классы).

Глава 3 «Управляющие инструкции (часть 1)» посвящена некоторым управляющим инструкциям. В ней вы изучите инструкции выбора if и if...else, инструкции цикла while со счетчиком и контрольным значением, а также операторы инкремента, декремента и присваивания. В разделе 3.12 мы покажем очередной пример использования готовых объектов: с помощью общедоступного класса вы будете выполнять вычисления с чрезвычайно большими целыми числами.

Глава 4 «Управляющие инструкции (часть 2)» рассказывает об управляющих инструкциях for, do...while, switch, break и continue, а также о логических операторах. В разделе 4.13 вы продолжите работать с готовыми объектами, включив библиотеку miniz-cpp для записи и чтения ZIP-файлов.

В главе 5 «Функции и шаблоны функций» представлены пользовательские функции. Мы расскажем о методах моделирования на примере генерации случайных чисел. Устаревшая функция генерации случайных чисел rand, которую C++ унаследовал от языка C, может быть предсказуемой, поэтому программы с ней ненадежны. Мы рассмотрим более безопасную библиотеку, введенную в C++11, которая генерирует недетерминированные (непредсказуемые) последовательности случайных чисел. Такие генераторы случайных чисел используются для моделирования событий и в сценариях безопасности, где предсказуемость недопустима. Также мы обсудим передачу информации между функциями и рекурсию. Пример с готовыми объектами в разделе 5.20 продемонстрирует шифрование с закрытым ключом.

Часть 2. Массивы, указатели и строки

В главе 6 «Массивы, векторы, библиотека ranges и функциональное программирование» мы приступим к рассмотрению контейнеров, итераторов и алгоритмов стандартной библиотеки C++. Мы представим вам контейнер array, предназначенный для хранения и обработки списков и таблиц значений. Вы определите массивы класса array, инициализируете их и получите доступ к их элементам. Вы узнаете, как передавать эти массивы функциям, выполнять сортировку и поиск в массивах, работать с многомерными массивами. Мы познакомим вас с функциональным программированием, начав с лямбда-выражений (безымянных функций) и диапазонов библиотеки ranges, которая входит в «большую четверку» новых возможностей C++20. В разделе 6.15 на примере готовых объектов мы продемонстрируем векторы — контейнеры данных, основанные на шаблоне класса vector стандартной библиотеки C++. По сути, вся эта глава представляет собой большой урок работы с готовыми объектами — массивами и векторами. Примеры исходного кода в этой главе хорошо иллюстрируют современные идиомы программирования на C++.

В главе 7 «Указатели в современном C++ (фактор риска)» подробно рассматриваются указатели и объясняется тесная взаимосвязь между указателями, массивами на основе указателей и строками на основе указателей (которые также называют строками в стиле C). Все эти традиционные элементы C++ унаследовал от языка C. Указатели являются мощным инструментом программиста, но с ними сложно работать и они часто становятся причиной ошибок в программах. Поэтому мы покажем вам современные альтернативы указателям, которые сделают ваш код более надежным и безопасным: классы array и vector, класс span (C++20) и класс string_view (C++17). Но вы должны уметь работать и с традиционными указателями, чтобы читать код старых программ. Мы расскажем о тех немногих случаях, когда указатели нужны даже в новых программах. Во всех остальных случаях мы рекомендуем использовать вместо указателей современные языковые средства. К ним относится класс span, с объектами которого вы будете работать в разделе 7.10. С помощью этого класса вы сможете, не используя указатели, читать и обрабатывать элементы традиционных массивов на основе указателей, а также современных контейнеров array и vector. В этой главе мы продолжим акцентировать внимание на современных идиомах программирования на C++.

В главе 8 «Строки и их представления, текстовые файлы, CSV-файлы и регулярные выражения» вы узнаете о больших возможностях класса string стандартной библиотеки. Затем мы расскажем, как выполнять операции чтения и записи с обычными текстовыми файлами и с файлами в формате CSV, которые часто применяются для работы с наборами данных. Мы также расскажем об операциях со строками с помощью поддерживаемых стандартной библиотекой регулярных выражений. В С++ есть два типа строк: объекты класса string и традиционные строки на основе указателей. Мы используем объекты класса string, чтобы сделать программы более надежными и избежать многих проблем безопасности, свойственных традиционным строкам. В новых разработках надо отдавать предпочтение объектам класса string. Вы узнаете о классе string_view (C++17) — простом и универсальном средстве передачи строк любого типа функциям. В конце главы вы продолжите работать с готовыми объектами:

• Раздел 8.19 посвящен анализу данных. Вы прочитаете и проанализируете CSV-файл, содержащий набор данных «Титаник», — один из популярных учебных инструментов для начинающих аналитиков.

• Раздел 8.20 посвящен регулярным выражениям, которые нужны для поиска и замены фрагментов текста.

Часть 3. Объектно-ориентированное программирование

В главе 9 «Пользовательские классы» вы начнете изучать объектно-ориентированное программирование и узнаете, как создавать свои собственные классы. Язык C++ является расширяемым: каждый созданный вами класс становится новым типом данных, после чего вы можете создавать любые объекты этого типа. В разделе 9.22 вы найдете очередной пример работы с готовыми объектами: сторонняя библиотека cereal позволит вам легко выполнять сериализацию (преобразование объектов в формат JavaScript Object Notation — JSON) и десериализацию (обратное преобразование из формата JSON).

Глава 10 «ООП: наследование и динамический полиморфизм» посвящена отношениям между классами в иерархии наследования и мощным средствам динамического полиморфизма, обеспечивающим эти отношения. Из этой главы вы узнаете об основных принципах полиморфизма. Один из самых важных моментов этой главы — подробная схема, объясняющая, как полиморфизм, виртуальные функции и динамическое связывание реализованы «под капотом» языка C++. Вы увидите, что для этого используется элегантная структура данных на основе указателей. Мы расскажем и о других средствах полиморфизма, среди которых идиома невиртуального интерфейса (NVI), а также std::variant и std::visit. Вы узнаете о преимуществах наследования интерфейса перед наследованием реализации.

В главе 11 «Перегрузка операторов, семантика копирования и перемещения, умные указатели» вы узнаете, как использовать стандартные операторы языка C++ для операций с объектами пользовательских (ваших собственных) классов. Вы также познакомитесь с умными указателями и с динамическим управлением памятью. Умные указатели позволяют избежать ошибок динамического управления памятью, предоставляя программисту больше возможностей, чем традиционные указатели. Мы обсудим умные указатели класса unique_ptr. Ключевая тема этой главы — создание полноценных высококачественных классов. Мы начнем с тест-драйва класса string, который является красивым примером перегрузки операторов. Затем мы перейдем к одному из важнейших примеров книги: вы узнаете, как написать пользовательский класс контейнеров MyArray, используя перегруженные операторы и другие языковые средства таким образом, чтобы в вашем классе не было проблем, свойственных массивам на основе указателей8. Мы представим вам и реализуем пять специальных функций, которые можно определять в каждом классе: копирующий конструктор, оператор копирующего присваивания, перемещающий конструктор, оператор перемещающего присваивания и деструктор. Мы обсудим семантику копирования, а также семантику перемещения, которая позволяет компилятору быстро перемещать ресурсы из одного объекта в другой, избегая бесполезных и ресурсоемких операций копирования. Мы расскажем о новом операторе трехстороннего сравнения (<=>) и о том, как реализовать пользовательские конвертирующие операторы. В главе 15 вы усовершенствуете класс MyArray, преобразовав его в шаблон класса, позволяющий хранить данные разных типов. Вы создадите по-настоящему полезные классы.

Глава 12 «Исключения и обзор контрактного программирования» продолжает тему обработки исключений, начатую в главе 6. Мы объясним, когда нужны исключения и какие бывают гарантии безопасности исключений, рассмотрим исключения в контексте конструкторов и деструкторов, расскажем об обработке ошибок динамического выделения памяти и о том, почему в некоторых проектах исключения запрещены. Глава завершается введением в так называемые контракты, которые могут появиться в будущих версиях C++; мы расскажем о контрактах на примере их экспериментальной реализации, опубликованной на сайте godbolt.org. Благодаря контрактам программисты смогут отказаться от большинства исключений (то есть объявлять большинство функций со спецификатором noexcept), что позволит компилятору оптимизировать исполняемый код и избежать сложных ресурсоемких операций, связанных с обработкой исключений.

Часть 4. Контейнеры, итераторы и алгоритмы стандартной библиотеки

В главе 13 «Контейнеры и итераторы стандартной библиотеки» начинается более широкое и глубокое рассмотрение трех ключевых компонентов стандартной библиотеки языка C++:

• контейнеров (основанных на шаблонах структур данных);

• итераторов (необходимых для доступа к элементам контейнеров);

• алгоритмов (использующих итераторы для обработки контейнеров).

Мы обсудим контейнеры, а также адаптеры контейнеров и псевдоконтейнеры. Вы увидите, что стандартная библиотека C++ предоставляет вам готовые структуры данных, широко применяемые программистами, поэтому вам не нужно создавать свои собственные. Почти все связанные со структурами данных задачи, которые вам могут встретиться, вы сможете решить средствами стандартной библиотеки. Мы продемонстрируем большинство контейнеров стандартной библиотеки и объясним, как применять алгоритмы к различным типам контейнеров, используя итераторы. Вы увидите, что разные контейнеры поддерживают разные типы итераторов. Мы продолжим показывать те ценные возможности упрощения кода, которые дает программисту введенная в C++20 библиотека ranges.

В главе 14 «Алгоритмы стандартной библиотеки, диапазоны и представления C++20» представлены многие из 115 алгоритмов стандартной библиотеки. В цент­ре внимания — типичные операции с контейнерами, в том числе заполнение контейнеров значениями, генерация значений, сравнение элементов и целых контейнеров, удаление элементов, замена элементов, математические операции, поиск, сортировка, обмен значениями, копирование, объединение, операции со множествами, определение границ контейнеров, нахождение наименьших и наибольших значений. Мы обсудим минимальные требования к итераторам, чтобы вы знали, какие контейнеры совместимы с тем или иным алгоритмом. Мы начинаем обсуждение концептов, входящих в «большую четверку» новых возможностей C++20. Алгоритмы из пространства имен std::ranges (C++20) используют концепты, чтобы проверять корректность получаемых аргументов. Мы продолжим обсуждение функционального программирования на примере диапазонов и представлений C++20.

Часть 5. Более сложные темы

В главе 15 «Шаблоны, концепты (C++20) и метапрограммирование» рассматривается обобщенное программирование на основе шаблонов, которое применяется в C++ с момента выхода стандарта 1998 года. Роль шаблонов возрастала с каждым новым выпуском C++. Для современного C++ характерен перенос значительной части ресурсоемких операций на этап компиляции, что позволяет компилятору более надежно контролировать типы данных и повышает быстродействие во время выполнения программ. Как вы увидите, шаблоны и особенно метапрограммирование на основе шаблонов — это важнейшие средства для переноса многих операций с этапа выполнения на этап компиляции. В этой главе мы более подробно рассмотрим шаблоны, объясним, как разрабатывать ваши собственные шаблоны классов, и детально рассмотрим введенные в C++20 концепты. Вы создадите свои собственные концепты, преобразуете созданный в главе 11 класс MyArray в шаблон класса, имеющий итераторы, а также поработаете с вариативными шаблонами, которые могут принимать любое количество аргументов. Мы познакомим вас с метапрограммированием на основе шаблонов.

Глава 16 «Модули C++20: технология разработки больших программ» представляет следующую из «большой четверки» новых возможностей C++20. Модули — это новый способ структурирования кода, позволяющий вам решать, какие объявления надо открыть для клиентского кода, и предотвратить доступ извне ко всем остальным деталям реализации классов. Модули помогают программистам работать эффективнее, особенно при создании, сопровождении и модернизации больших информационных систем. Модули помогают быстрее создавать такие системы и делают их более масштабируемыми. По словам создателя C++ Бьерна Страуструпа, «модули дают языку C++ историческую возможность улучшить чистоту кода и время компиляции (перенося C++ в XXI век)». Вы увидите, что даже при разработке небольших систем модули немедленно дают преимущества, устраняя необходимость в препроцессоре C++. Мы бы с удовольствием интегрировали модули в наши программы, но на данный момент в наших основных компиляторах еще не реализована полноценная поддержка модулей.

Глава 17 «Параллельные алгоритмы и конкурентность: высокоуровневый подход» — одна из самых важных в книге. В ней представлены имеющиеся в C++ средства создания многопоточных приложений. Распределение нескольких задач между потоками процессора может значительно повышать быстродействие и скорость реакции программы. Мы показываем, как использовать готовые параллельные алгоритмы (C++17) для создания многопоточных программ, которые будут работать быстрее (как правило, намного быстрее) на современных компьютерах с многоядерными процессорами. Например, мы сортируем 100 миллионов чисел сначала последовательным, а затем параллельным алгоритмом, измеряя с помощью библиотеки <chrono> прирост производительности параллельного алгоритма на 4-ядерном и 8-ядерном процессорах. Вы увидите, что на компьютере с 64-битной версией Windows 10 и 8-ядерным процессором Intel параллельная сортировка может выполняться почти в 7 раз быстрее, чем последовательная. Мы обсуждаем взаимодействие потока-производителя и потока-потребителя, демонстрируя различные способы их синхронизации с помощью низкоуровневых и высокоуровневых средств конкурентного программирования, в том числе защелок, барьеров и семафоров, введенных в C++20. Мы объясняем, в чем заключается сложность конкурентного программирования и почему при любой возможности надо отдавать предпочтение высокоуровневым средствам конкурентности. Такие низкоуровневые средства, как семафоры и атомарные типы, имеет смысл применять для реализации средств более высокого уровня, таких как защелки.

В главе 18 «Корутины (C++20)» представлены корутины — последняя из «большой четверки» новых возможностей C++20. Корутина — это функция, которая может приостановить свое выполнение, а впоследствии возобновить его по инструкции из другой части программы. Все механизмы реализации такого поведения корутин полностью реализуются компилятором без вашего участия. Вы увидите, что корутиной является любая функция, содержащая хотя бы одно из ключевых слов co_await, co_yield или co_return, и такие функции дают вам возможность писать программы с конкурентными задачами, сохраняя простой последовательный стиль кодирования. Для поддержки корутин нужна сложная инфраструктура, которую вы теоретически могли бы написать самостоятельно, но это сложно, утомительно и чревато ошибками. Большинство экспертов сходятся во мнении, что надо использовать готовые высокоуровневые библиотеки поддержки корутин, и мы демонстрируем именно такой подход. В сообществе разработчиков открытого программного обеспечения уже созданы несколько экспериментальных библиотек для быстрой и удобной работы с корутинами. Две из них мы используем в примерах кода этой главы. Вероятно, поддержка корутин будет добавлена в стандартную библиотеку C++23.

Приложения

Приложение А «Приоритеты и группировка операторов» содержит список стандартных операторов языка C++, отсортированных по их приоритетам. В первый раздел списка включены наиболее приоритетные операторы (выполняемые первыми), в каждый последующий раздел — операторы с последовательно убывающими приоритетами.

Приложение Б «Набор символов ASCII» содержит список стандартных символов и соответствующих им чисел.

8 В программах для промышленного применения вы должны использовать для контейнеров классы стандартной библиотеки, но этот учебный пример позволяет продемонстрировать многие ключевые концепции современного C++.

Дополнительные материалы на сайте deitel.com

Веб-страница этой книги расположена на сайте deitel.com по адресу:

https://deitel.com/c-plus-plus-20-for-programmers

На этой странице вы найдете следующие дополнительные материалы:

• ссылки на наш репозиторий на портале GitHub, содержащий все примеры исходного кода из этой книги в виде загружаемых файлов;

• посты в блоге: https://deitel.com/blog;

• обновления к книге.

Рекомендации по загрузке файлов и по настройке вашей среды разработки программ на C++ приведены в разделе «Перед началом работы».

C++ Core Guidelines

C++ Core Guidelines — это сборник рекомендаций объемом около 500 печатных страниц, «призванный помочь людям эффективно использовать современный язык C++»9. Он написан под редакцией Бьерна Страуструпа (создателя языка C++) и Херба Саттера (председателя комитета ISO по стандартам C++):

https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

Авторы C++ Core Guidelines указывают:

Эти рекомендации сосредоточены на относительно высокоуровневых проблемах, таких как интерфейсы, управление ресурсами, управление памятью и конкурентность. Эти правила влияют на архитектуру приложений и на проектирование библиотек. Результатом выполнения этих правил будет статически типобезопасный код, не вызывающий утечек ресурсов, в котором будет исправлено значительно больше логических ошибок программирования, чем обычно бывает в современном коде. И он будет работать быстро — вы сможете позволить себе делать все правильно10.

На протяжении всей книги мы используем соответствующие рекомендации из C++ Core Guidelines. Вы обязательно должны уделять пристальное внимание этим мудрым советам. В сборник включены сотни основных рекомендаций, разделенных на десятки категорий и подкатегорий. Их выполнение может показаться вам крайне трудным, но с помощью статических анализаторов кода (см. далее) вы легко проверите любой свой код на соответствие C++ Core Guidelines.

Библиотека Guidelines Support Library (GSL)

В C++ Core Guidelines часто упоминается библиотека Guidelines Support Library (GSL), в которой реализованы вспомогательные классы и функции для поддержки различных рекомендаций11. Microsoft предоставляет свою реализацию GSL с открытым исходным кодом на портале GitHub по адресу:

https://github.com/Microsoft/GSL

Мы используем GSL в нескольких примерах кода из первой половины книги. Некоторые средства из GSL впоследствии были включены в стандартную биб­лиотеку C++.

9 C++ Core Guidelines, «Abstract». Был доступен: 15 сентября 2023 г. https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#S-abstract.

10 C++ Core Guidelines, «Abstract».

11 C++ Core Guidelines, «GSL: Guidelines Support Library». Был доступен: 15 сентября 2023 г. https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#S-gsl.

Профессиональные статические анализаторы кода

Эти средства статического анализа кода позволяют быстро проверить ваш код на наличие типичных ошибок и проблем безопасности, а также сообщают о том, как его улучшить. Использование анализаторов дает почти такой же эффект, как проверка кода экспертами мирового класса. Чтобы всегда следовать рекомендациям C++ Core Guidelines и улучшить приведенные в книге примеры кода, мы использовали следующие статические анализаторы:

• clang-tidy — https://clang.llvm.org/extra/clang-tidy;

• cppcheck — https://cppcheck.sourceforge.io;

• средства проверки кода на соответствие C++ Core Guidelines, встроенные в статический анализатор кода Microsoft Visual Studio.

С помощью этих трех инструментов мы проверили:

• соответствие рекомендациям C++ Core Guidelines;

• соответствие стандартам кодирования;

• соответствие современным идиомам C++;

• отсутствие проблем с безопасностью;

• отсутствие типичных ошибок;

• отсутствие проблем с быстродействием;

• наглядность кода

и многое другое.

Кроме того, мы использовали флаг -Wall в командах компиляторов GNU g++ и Clang C++, чтобы включить все категории выдаваемых ими предупреждений, сообщающих о возможных проблемах. Мы добились того, что наши программы компилируются без таких сообщений (кроме редких случаев, выходящих за рамки тем этой книги). Информация о настройке средств статического анализа кода приведена в разделе «Перед началом работы».

Интернет-ресурсы для программистов

Stack Overflow

Stack Overflow — один из популярнейших сайтов вопросов и ответов, предназначенный для разработчиков программного обеспечения. Многие проблемы, с которыми сталкиваются программисты, уже обсуждались на Stack Overflow, поэтому это отличное место, чтобы искать решения таких проблем и задавать новые вопросы. В ходе работы над книгой многие из наших поисковых запросов в Google на различные темы, зачастую сложные, приводили среди первых результатов ответы на Stack Overflow.

GitHub

Лучший способ подготовиться [к работе программиста] — это писать программы и изучать замечательные программы, написанные другими людьми. В моем случае я ходил к мусорным корзинам в Центре компьютерных наук и вылавливал из них листинги операционных систем12. (Б. Гейтс)

GitHub — это отличная площадка для поиска бесплатного и открытого исходного кода, который может пригодиться вам в ваших проектах. Если хотите, вы можете публиковать на GitHub исходный код написанных вами программ, участвуя в деятельности всемирного сообщества разработчиков открытого программного обеспечения. Пятьдесят миллионов программистов используют GitHub13. На сайте размещено более 200 миллионов репозиториев исходного кода на огромном количестве языков программирования14. В 2021 году авторы опубликовали свои новые работы более чем в 61 миллионе репозиториев15. GitHub является важнейшим элементом арсенала профессионального разработчика программного обеспечения и содержит средства контроля версий, которые помогают командам разработчиков управлять проектами с открытым кодом и частными проектами.

Сообщество разработчиков C++ с открытым кодом очень велико. На GitHub есть более 41 тысячи16 репозиториев исходного кода на C++. На GitHub вы можете исследовать написанный другими код и при желании компилировать его. Это отличный способ изучения программирования, который является естественным продолжением нашего учебного подхода на основе реального кода17.

В 2018 году компания Microsoft приобрела GitHub за 7.5 миллиарда долларов. Если вы профессиональный программист, вы почти наверняка регулярно пользуетесь GitHub. По словам генерального директора Microsoft Сатьи Наделлы, компания приобрела GitHub, чтобы «расширить для каждого разработчика возможности творчества, внедрения инноваций и решения самых актуальных мировых проблем»18.

Мы призываем вас изучать и компилировать многочисленные программы с портала GitHub, а также вносить свой вклад в его работу.

12 Билл Гейтс (Bill Gates), цитата из работы Сьюзан Ламмерс (Susan Lammers) «Interviews with 19 Programmers Who Shaped the Computer Industry». Microsoft Press, 1986, с. 83.

13 «GitHub». Был доступен: 15 сентября 2023 г. https://github.com.

14 «Where the World Builds Software». Был доступен: 15 сентября 2023 г. https://github.com/about.

15 «The 2021 State of the Octoverse». Был доступен: 15 сентября 2023 г. https://octoverse.github.com.

16 «C++». Был доступен: 15 сентября 2023 г. https://github.com/topics/cpp.

17 Перед использованием публикуемых на GitHub программ с открытым исходным кодом вам необходимо ознакомиться с разнообразными лицензиями на такие программы.

18 «Microsoft to Acquire GitHub for $7.5 Billion». Был доступен: 15 сентября 2023 г. https://news.microsoft.

Docker

Мы используем Docker — инструмент для упаковки программ в контейнеры, содержащие все необходимое для того, чтобы было удобно работать с этими программами на компьютерах с разными операционными системами. Некоторые программы и программные пакеты трудно устанавливать и настраивать. Но многие из них можно бесплатно загрузить в виде готовых контейнеров Docker, чтобы избежать сложных проблем с установкой. Сразу после загрузки вы можете запускать их на обычных настольных компьютерах или ноутбуках, что делает Docker отличным средством для быстрого, удобного и экономичного изучения новых технологий.

Мы покажем, как устанавливать и запускать полностью настроенные контейнеры Docker, содержащие:

• пакет компиляторов GNU Compiler Collection (GCC), в состав которого входит компилятор g++;

• последнюю версию компилятора clang++ от команды разработчиков Clang.

Эти контейнеры работают в Docker на компьютерах с Windows, macOS и Linux.

Docker способствует воспроизводимости результатов. В контейнерах Docker вы можете сохранять ваши настроенные конфигурации со всеми программами и биб­лиотеками, которые используете. Это позволит другим программистам полностью воссоздавать вашу рабочую среду, а затем точно повторять вашу работу. И вы тоже сможете таким образом стабильно воспроизводить ваши собственные результаты. Воспроизводимость особенно важна в науке и в медицине, например, когда исследователи хотят подтвердить и расширить результаты работ, изложенные в опубликованных статьях.

Некоторые ключевые документы и ресурсы по C++

В книгу включены сотни ссылок на видеоролики, записи в блогах, статьи и онлайн-справочники, которые мы изучали, работая над книгой. Возможно, вы захотите обратиться к некоторым из этих ресурсов для изучения более сложных языковых средств и идиом. Основным сборником документации по C++ фактически является сайт cppreference.com. Мы часто ссылаемся на него, чтобы у вас была подробная справочная информация о стандартных классах и функциях C++, рассматриваемых в книге. Кроме того, мы часто ссылаемся на финальный проект стандарта C++20, который доступен бесплатно на GitHub по адресу:

https://timsong-cpp.github.io/cppwp/n4861

Ниже мы приводим список ресурсов по C++, которые могут быть вам полезны в процессе изучения нашей книги.

Документация

• Финальный проект стандарта C++20, принятый Комитетом по стандартам C++:

https://timsong-cpp.github.io/cppwp/n4861

• Документация по C++:

https://cppreference.com

• Документация по C++ от Microsoft:

https://docs.microsoft.com/en-us/cpp/cpp

• Документация по стандартной библиотеке GNU C++:

https://gcc.gnu.org/onlinedocs/libstdc++/manual/index.html

Блоги

• Блог Херба Саттера (Herb Sutter) «Sutter’s Mill» о разработке программного обеспечения:

https://herbsutter.com

• Блог команды Microsoft по C++:

https://devblogs.microsoft.com/cppblog

• Блог Мариуса Банчилы (Marius Bancila):

https://mariusbancila.ro/blog

• Блог Джонатана Боккары (Jonathan Boccara):

https://www.fluentcpp.com

• Блог Бартломея Филипека (Bartlomiej Filipek):

https://www.cppstories.com

• Блог Райнера Гримма (Rainer Grimm):

http://modernescpp.com

• Блог Артура О’Двайра (Arthur O’Dwyer):

https://quuxplusone.github.io/blog

Дополнительные ресурсы

• Сайт Бьерна Страуструпа:

https://stroustrup.com

• Сайт организации Standard C++ Foundation:

https://isocpp.org

• Сайт Комитета по стандартам C++:

http://www.open-std.org/jtc1/sc22/wg21

Сайты, где ответят на ваши вопросы

К числу самых популярных в мире интернет-форумов по языку C++ (и по программированию вообще) относятся:

• https://stackoverflow.com

• https://www.reddit.com/r/cpp

• https://groups.google.com/g/comp.lang.c++

• https://www.dreamincode.net/forums/forum/15-c-and-c

Здесь вы найдете адреса еще нескольких полезных сайтов:

https://www.geeksforgeeks.org/stuck-in-programming-get-the-solution-from-these-10-best-websites

Кроме того, поставщики программного обеспечения часто создают интернет-форумы для поддержки своих инструментов и библиотек. Многие библиотеки координируются и поддерживаются на GitHub. На страницах некоторых библио­тек на GitHub вы можете обращаться к их разработчикам за поддержкой через вкладку Issues.

Общение с авторами

Если при чтении книги у вас возникнут вопросы, вы можете связаться с нами по адресу:

[email protected]

Мы оперативно ответим.

Благодарности

Мы благодарим Барбару Дейтел (Barbara Deitel) за долгие часы, которые она посвятила поиску информации в интернете во время нашей работы над этим проектом. Нам посчастливилось работать с преданной своему делу командой профессионалов издательского дела из компании Pearson. Мы высоко ценим усилия и 27-летнее наставничество нашего друга и коллеги Марка Л. Тауба (Mark L. Taub), вице-президента Pearson IT Professional Group. Марк и его команда издают наши профессиональные книги и видеопродукцию LiveLessons, а также спонсируют наши обучающие вебинары, предлагаемые через сервис O’Reilly Online Learning:

https://learning.oreilly.com

Чарви Арора (Charvi Arora) искала рецензентов и руководила процессом рецензирования. Джули Нахиль (Julie Nahil) руководила выпуском книги. Чути Прасерсит (Chuti Prasertsith) разработала дизайн обложки.

Рецензенты

В этом проекте нам посчастливилось получить рецензии на рукопись от десяти известных специалистов. Большинство рецензентов входят в состав Комитета ISO по стандартам C++, работали в нем или имеют с ним рабочие отношения. Многие из них внесли свой вклад в развитие языка. Они помогли нам сделать книгу лучше, а все оставшиеся в ней недостатки — наши собственные.

• Андреас Фертиг (Andreas Fertig), независимый преподаватель и консультант по C++, создатель сайта cppin-sights.io, автор книги «Programming with C++20».

• Марк Грегуар (Marc Gregoire), архитектор программного обеспечения, Nikon Metrology, эксперт класса Microsoft Visual C++ MVP, автор книги «Professio­nal C++» (5-е издание, обновленное с учетом C++20).

• Д-р Дейзи Холлман (Dr. Daisy Hollman), член комитета ISO по стандартам C++.

• Дэнни Калев (Danny Kalev), доктор философии, сертифицированный системный аналитик и инженер-программист, бывший член комитета ISO по стандартам C++.

• Дитмар Куль (Dietmar Kühl), старший разработчик программного обеспечения, Bloomberg L.P., член комитета ISO по стандартам C++.

• Инбал Леви (Inbal Levi), Solar Edge Technologies, директор ISO C++ Foundation, председатель группы ISO C++ SG9 (Ranges), член комитета ISO по стандартам C++.

• Артур О’Двайр (Arthur O’Dwyer), преподаватель C++, председатель трека CppCon «Back to Basics», автор нескольких принятых предложений по развитию языка в версиях C++17, C++20 и C++23, автор книги «Mastering the C++17 STL».

• Саар Раз (Saar Raz), старший инженер-программист, Swimm.io, разработчик концептов C++20 в команде Clang.

• Хосе Антонио Гонсалес Секо (José Antonio González Seco), член парламента Андалусии.

• Энтони Уильямс (Anthony Williams), член комиссии по стандартам C++ Британского института стандартов, директор компании Just Software Solutions Ltd., автор книги «C++ Concurrency in Action» (2-е издание). Энтони является автором или соавтором многих документов Комитета по стандартам C++, которые привели к появлению стандартных средств конкурентности в C++.

Артур О’Двайр

Мы должны отметить исключительные усилия, которые Артур О’Двайр приложил к рецензированию нашей рукописи. Из его комментариев мы узнали много нового о тонкостях языка C++ и особенно о современных идиомах программирования на C++. Он не только добавил детальные комментарии во все PDF-файлы с главами книги, которые мы ему отправляли, но и предоставил нам отдельный документ с подробным объяснением своих комментариев, во многих случаях переписал код и указал на внешние ресурсы с ценной информацией. Учитывая все замечания рецензентов, мы всегда с нетерпением ждали, что скажет Артур, особенно по самым сложным вопросам. Он занятой эксперт, но щедро тратил свое время и всегда был конструктивен. Он настаивал на том, чтобы мы «сделали все правильно», и прилагал все усилия, чтобы помочь нам в этом. Артур преподает C++ профессиональным программистам. Он научил нас многим приемам правильной работы с C++.

GitHub

Благодарим GitHub за то, что он позволяет нам легко делиться своим кодом и поддерживать его в актуальном состоянии, а также за предоставление инструментов, которые позволяют десяткам миллионов разработчиков вносить свой вклад в сотни миллионов репозиториев исходного кода19. Эти инструменты помогают всемирному сообществу разработчиков открытого программного обеспечения, предоставляющему библиотеки для популярных языков программирования, упростить создание мощных приложений и избавить коллег от необходимости «изобретать велосипед».

Мэтт Годболт и Compiler Explorer

Благодарим Мэтта Годболта (Matt Godbolt), создателя онлайн-сервиса Compiler Explorer (https://godbolt.org), который позволяет компилировать и запускать программы на многих языках программирования. Благодаря этому сервису вы можете протестировать свой код:

• на большинстве популярных компиляторов C++, включая три рекомендуемых нами компилятора;

• на многих выпущенных, разрабатываемых и экспериментальных версиях компиляторов.

Например, мы использовали имеющуюся в Compiler Explorer экспериментальную версию компилятора g++, чтобы продемонстрировать в главе 12 предварительную функциональность контрактов, которые надеемся увидеть в стандартной библиотеке одной из будущих версий C++. Несколько наших рецензентов использовали сайт godbolt.org, чтобы показывать нам предлагаемые изменения в коде; это помогло нам улучшить книгу.

Дитмар Куль

Благодарим Дитмара Куля (Dietmar Kühl), старшего разработчика программного обеспечения в компании Bloomberg L.P. и члена комитета ISO по стандартам C++, который поделился с нами своими взглядами на наследование, статический и динамический полиморфизм. Он помог нам точнее изложить эти темы в главах 10 и 15.

Райнер Гримм

Благодарим Райнера Гримма (Rainer Grimm), одного из самых популярных блогеров сообщества C++ (http://modernescpp.com). По мере углубления в темы C++20 поиск в Google часто приводил нас к его статьям. Райнер Гримм — профессиональный преподаватель C++, читающий курсы на немецком и английском языках. Он написал несколько книг по C++, в том числе «C++20: Get the Details», «Concurrency with Modern C++», «The C++ Standard Library» (3-е изд.) и «C++ Core Guidelines Explained». Райнер ведет блог о тех новых возможностях языка, которые ожидаются в C++23.

Брайан Гетц

Нам повезло, что рецензентом одной из наших книг — «Java How to Program (10-е издание) — был Брайан Гетц (Brian Goetz), архитектор языка Oracle Java и соавтор книги «Java Concurrency in Practice». Он предоставил нам множество идей и конструктивных комментариев, особенно по следующим темам:

• проектирование иерархии наследования (это помогло нам в работе над примерами исходного кода в главе 10 «ООП: наследование и динамический полиморфизм»);

• конкурентность в Java (это помогло нам в работе над главой 17 «Параллельные алгоритмы и конкурентность: высокоуровневый подход»).

Разработчики программ с открытым исходным кодом и блогеры

Мы благодарны технически грамотным людям со всего мира, которые участвуют в движении открытого программного обеспечения и ведут блоги, а также организациям, которые помогают распространению открытого программного обеспечения и информации о нем.

Поисковая система Google

Спасибо Google, чья поисковая система отвечает на наш постоянный поток запросов, выполняя каждый из них за доли секунды, в любое время дня и ночи, причем совершенно бесплатно. Это лучший инструмент повышения производительности труда, который мы добавили в наш исследовательский процесс за последние 20 лет!

Grammarly

Теперь мы используем платную версию Grammarly для проверки всех наших рукописей. Разработчики этого сервиса отмечают, что он помогает «писать ярко, понятно, без ошибок», пользуясь «текстовым помощником на основе искусственного интеллекта»20. Они также утверждают: «Используя различные инновационные подходы, в том числе передовое машинное обучение и глубокое обучение, мы постоянно открываем новые возможности в области обработки естественного языка (NLP), чтобы предоставлять непревзойденную помощь»21.

Grammarly предлагает бесплатные инструменты, которые можно интегрировать в несколько популярных веб-браузеров, а также в Microsoft® Office365™ и в Google Docs™. В дополнение к этому предлагаются более мощные премиум-инструменты и версия для бизнеса. Здесь вы можете узнать о разных вариантах бесплатного и платного использования сервиса:

https://www.grammarly.com/plans

Мы будем благодарны за ваши замечания, критику, исправления и предложения по улучшению книги, если таковые появятся у вас при чтении книги. Всю корреспонденцию, включая вопросы, мы просим направлять по адресу:

[email protected]

Мы оперативно ответим.

Мы приглашаем вас в захватывающий мир программирования на C++20. За последние 30 лет мы с удовольствием работали над 11 изданиями наших академических и профессиональных книг по C++. Мы надеемся, что книга «C++20 для программистов. Метод готовых объектов» вам понравится и вы получите познавательный, серьезный и интересный опыт разработки программ на современном C++.

Пол Дейтел, Харви Дейтел

19 «Where the World Builds Software». Был доступен: 15 сентября 2023 г. https://github.com/about.

20 «Grammarly». Был доступен: 15 сентября 2023 г. https://www.grammarly.com.

21 «Our Mission». Был доступен: 15 сентября 2023 г. https://www.grammarly.com/about.

Об авторах

Пол Дж. Дейтел (Paul J. Deitel), генеральный директор и технический директор компании Deitel & Associates, Inc., — выпускник Массачусетского технологического института, 42 года работающий в компьютерной сфере. Пол — один из самых опытных в мире преподавателей языков программирования, он с 1992 года ведет профессиональные курсы для разработчиков программного обеспечения. Прочитал сотни курсов по программированию для академических, промышленных, правительственных и военных организаций, которые являются клиентами Deitel & Associates. Среди них Калифорнийский университет, Cisco, IBM, Siemens, Sun Microsystems (теперь Oracle), Dell, Fidelity, NASA (Космический центр им. Кеннеди), Национальная лаборатория сильных штормов, ракетный полигон White Sands, Rogue Wave Software, Boeing, Puma, iRobot и многие другие. Пол Дж. Дейтел и его соавтор, доктор Харви М. Дейтел, являются авторами одних из самых популярных в мире учебников по языкам программирования, профессиональных книг, видеофильмов и интерактивных мультимедийных электронных курсов, а также ведущими тренингов.

Харви М. Дейтел (Harvey M. Deitel), председатель совета директоров и директор по стратегии компании Deitel & Associates, Inc., имеет более 60 лет опыта работы в области вычислительной техники. Он получил степени бакалавра и магистра электротехники в Массачусетском технологическом институте и степень доктора математики в Бостонском университете (изучал вычислительную технику по всем этим программам еще до того, как в этих вузах были созданы факультеты компьютерных наук). Харви М. Дейтел имеет большой опыт преподавания в отраслевых организациях и колледжах, он был председателем факультета компьютерных наук в Бостонском колледже, а затем вместе с сыном Полом основал в 1991 году компанию Deitel & Associates. Публикации Дейтелов получили международное признание: более 100 переводов опубликованы на японском, немецком, русском, испанском, французском, польском, итальянском, упрощенном китайском, традиционном китайском, корейском, португальском, греческом, урду и турецком языках. Доктор Дейтел прочитал сотни курсов по программированию для академических, корпоративных, правительственных и военных клиентов.

От издательства

Все примеры исходного кода, приведенные в книге, вы можете скачать в виде ZIP-файла с сайта издательства «Питер» по адресу https://clck.ru/38xMy4.

Кроме того, в качестве бонуса вы можете скачать дополнительные онлайн-главы (на английском языке), которые авторы не включили в печатное издание книги.

Авторы снабдили текст книги внушительным количеством ссылок на электронные ресурсы на английском языке, в частности на статьи из Википедии. Там, где в российской Википедии имеются аналогичные статьи, ссылки были заменены на русскоязычные.

Ваши замечания, предложения, вопросы отправляйте по адресу [email protected] (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

На веб-сайте издательства www.piter.com вы найдете подробную информацию о наших книгах.

Перед началом работы

Перед тем как вы приступите к изучению C++, прочитайте этот раздел, чтобы узнать, что означают условные обозначения в книге и как подготовить свой компьютер к компиляции и выполнению программ.

Условные обозначения

В книге используются следующие шрифтовые обозначения.

Все примеры исходного кода, а также данные ввода-вывода набраны моноширинными шрифтами. Ключевые слова выделены жирным, а комментарии в коде — более светлым шрифтом. Обратите внимание, что номера в начале строк не являются частью инструкций C++ и добавлены только для наглядности:

1int main() {

2 std::cout << "Welcome to C++!\n"; // Выводим сообщение

3return 0; // Успешное завершение программы

4 }

В основном тексте книги моноширинным шрифтом выделены слова и символы, обозначающие идентификаторы языка C++ (в том числе имена функций, классов и объектов), операторы, значения переменных, локальные пути и имена файлов, фрагменты исходного кода, фрагменты данных ввода-вывода, названия программных компонентов и подобные компьютерные сущности.

Жирным шрифтом выделены важные термины и их английские эквиваленты.

Загрузка примеров кода

Примеры кода, включенные в книгу «C++20 для программистов. Метод готовых объектов», мы храним в репозитории GitHub22. На веб-странице книги в разделе Source Code есть ссылка на этот репозиторий, а также прямая ссылка на ZIP-файл со всеми примерами кода:

https://deitel.com/cpp20fp

Если вы знакомы с Git и GitHub, клонируйте этот репозиторий в своей системе. Если вы скачали ZIP-файл, распакуйте его содержимое. В наших дальнейших инструкциях мы исходим из того, что вы уже скопировали примеры кода из ZIP-файла в папку examples, расположенную в папке Documents вашей учетной записи пользователя.

Если вы еще не работали с Git и GitHub, но хотите узнать об этих важнейших инструментах разработчика, ознакомьтесь с их руководствами по адресу:

https://guides.github.com/activities/hello-world

Компиляторы, на которых мы тестировали исходный код

Убедитесь, что на вашем компьютере установлена последняя версия компилятора C++. Мы протестировали все приведенные в книге примеры кода на нескольких бесплатных компиляторах, которые рекомендуем:

• В операционной системе Microsoft Windows мы использовали интегрированную среду разработки Microsoft Visual Studio в версии Community Edition23, включающую в себя компилятор Visual C++ и другие инструменты разработки от Microsoft.

• В операционной системе macOS мы использовали компилятор C++, входящий в состав Apple Xcode24 и представляющий собой разновидность компилятора Clang C++.

• В операционной системе Linux мы использовали компилятор GNU C++25, входящий в состав пакета GNU Compiler Collection (GCC). Пакет GNU C++ уже установлен на многих компьютерах с Linux, но вам, возможно, надо обновить этот компилятор до более свежей версии. Его можно устанавливать и на компьютерах с macOS и Windows.

• Вы можете запускать последние версии компиляторов GNU C++ и Clang C++ во всех трех операционных системах — Windows, macOS и Linux — с помощью контейнеров Docker.

• Далее в разделе «Перед началом работы» описана установка перечисленных компиляторов и контейнеров Docker. В главе 1 книги, в разделе 1.2, мы покажем, как с помощью этих компиляторов компилировать и запускать написанные на C++ программы.

Не все примеры кода совместимы со всеми тремя компиляторами

К моменту выхода этой книги26 производители компиляторов еще не полностью реализовали в них некоторые из новых возможностей C++20. Они будут реализованы в последующих версиях компиляторов, и тогда мы заново протестируем код, обновим наш цифровой контент и опубликуем обновления на сайте:

https://deitel.com/cpp20fp

Установка Visual Studio Community Edition в Windows

Если вы работаете в Windows, прежде всего посетите эту страницу и убедитесь, что ваш компьютер соответствует требованиям, обязательным для установки Microsoft Visual Studio Community Edition:

https://docs.microsoft.com/en-us/visualstudio/releases/2022/system-requirements

Затем перейдите по адресу загрузки:

https://visualstudio.microsoft.com/downloads

Для загрузки и установки выполните следующие шаги.

1. Нажмите кнопку Free download на вкладке веб-страницы Community.

2. Загрузите предлагаемый установочный файл (VisualStudioSetup.exe) и запустите его из той папки, в которую вы его загрузили.

3. В диалоговом окне User Account Control (Контроль учетных записей) нажмите кнопку Yes, чтобы разрешить инсталлятору внести изменения в вашу систему.

4. В диалоговом окне Visual Studio Installer нажмите кнопку Continue, чтобы разрешить инсталлятору загрузить компоненты, необходимые для дальнейшего выбора конфигурации.

5. Для работы с примерами кода из этой книги выберите в следующем окне пункт Desktop Development with C++, включающий компилятор Visual C++ и стандартную библиотеку C++.

6. Нажмите кнопку Install. Начнется процесс загрузки и установки Visual Studio, который может занять много времени, особенно если у вас относительно медленное интернет-соединение.

Установка Xcode в macOS

На компьютере с macOS выполните следующие шаги для установки Xcode.

1. Откройте меню Apple и выберите пункт App Store... (или нажмите на значок App Store в нижней панели).

2. В строке поиска App Store наберите: Xcode.

3. Нажмите кнопку Get, чтобы установить Xcode.

Установка актуальной версии GNU C++

Существует множество дистрибутивов Linux, в которых используются разные методы обновления программ. Обратитесь к онлайн-документации вашего дистрибутива, чтобы узнать, как правильно обновить GNU C++ до последней версии. Вы также можете загрузить GNU C++ для разных платформ по адресу:

https://gcc.gnu.org/install/binaries.html

Установка GNU Compiler Collection в Ubuntu Linux, запущенной в подсистеме Windows для Linux

Если вы хотите установить GNU Compiler Collection на компьютер с Windows, это можно сделать с помощью подсистемы Windows для Linux (Windows Subsystem for Linux, WSL), которая позволяет запускать Linux в Windows. Вы можете легко установить Ubuntu Linux из Microsoft Store, но сначала необходимо установить WSL.

1. В строке поиска на панели задач наберите: Turn Windows features on or off (Включение или отключение компонентов Windows), затем нажмите кнопку Open (Открыть) в результатах поиска.

2. В открывшемся окне найдите в списке пункт Windows Subsystem for Linux (Подсистема Windows для Linux). Если в нем стоит галочка, то WSL уже установлена. Если галочки нет, поставьте ее и нажмите кнопку OK. Windows установит WSL и предложит вам перезагрузить компьютер.

3. После перезагрузки и входа в систему откройте приложение Microsoft Store, выполните поиск по слову Ubuntu, выберите приложение Ubuntu и нажмите кнопку Install (Установить). После этого будет установлена последняя версия Ubuntu Linux.

4. После установки нажмите кнопку Launch, чтобы открыть окно командной строки Ubuntu Linux, в котором процесс установки продолжится. Вам будет предложено создать имя пользователя и пароль для Ubuntu — они не должны совпадать с вашим именем пользователя и паролем для Windows.

5. Когда установка Ubuntu завершится, выполните следующие две команды, чтобы установить пакет GCC и отладчик GNU (при этом система может попросить вас ввести пароль для учетной записи, созданной на шаге 4):

sudo apt-get update

sudo apt-get install build-essential gdb

Убедитесь, что компилятор g++ установлен, выполнив следующую команду:

g++ --version

Перед началом работы с нашими примерами исходного кода выполните в Ubuntu команду cd для изменения текущей папки, например:

cd /mnt/c/Users/YourUserName/Documents/examples

Используйте в этой команде свое имя пользователя и путь к папке, в которую вы поместили файлы с примерами исходного кода.

Docker и контейнеры Docker

Docker — это утилита для упаковки программ в контейнеры (также называемые образами), в которых собрано все необходимое для выполнения этих программ на разных платформах, что особенно полезно для программных пакетов со сложными настройками и конфигурациями. Для многих таких пакетов предлагаются бесплатные готовые контейнеры Docker (обычно на сайте https://hub.docker.com), которые вы можете загрузить и запустить локально на своем компьютере. Docker — это отличный способ быстро и удобно начать работу с новыми технологиями. Это также отличный способ поэкспериментировать с новыми версиями компиляторов.

Установка Docker

Чтобы использовать контейнеры Docker, необходимо сначала установить Docker. Если вы работаете в Windows или macOS, загрузите с этого сайта и запустите программу установки Docker Desktop:

https://www.docker.com/get-started

Затем следуйте инструкциям на экране. Кроме того, зарегистрируйте на этой странице свою учетную запись Docker Hub, чтобы получить возможность пользоваться контейнерами с сайта https://hub.docker.com. Если вы работаете в Linux, установите с этого сайта Docker Engine:

https://docs.docker.com/engine/install

Загрузка контейнера Docker, содержащего GNU Compiler Collection

Команда разработчиков GNU предоставляет официальные контейнеры Docker по адресу:

https://hub.docker.com/_/gcc

После установки и запуска Docker откройте командную строку27 (в Windows), терминал (в macOS или Linux) или командную оболочку (Linux), затем выполните команду:

docker pull gcc:latest

После этого Docker загрузит контейнер, содержащий GNU Compiler Collection (GCC) последней версии (11.2 на момент написания книги). В разделе 1.2 мы покажем, как запустить этот контейнер и использовать его для компиляции и запуска программ, написанных на C++.

Загрузка контейнера Docker, содержащего Clang

В настоящее время у команды разработчиков Clang нет своего официального контейнера Docker, но многие готовые к работе контейнеры есть на сайте https://hub.docker.com. Для этой книги мы использовали следующий популярный контейнер:

https://hub.docker.com/r/teeks99/clang-ubuntu

Откройте командную строку (в Windows), терминал (в macOS или Linux) или командную оболочку (в Linux), затем выполните команду:

docker pull teeks99/clang-ubuntu:latest

После этого Docker загрузит контейнер, содержащий Clang последней версии (13.0 на момент написания книги). В разделе 1.2 мы покажем, как запустить этот контейнер и использовать его для компиляции и запуска программ, написанных на C++.

Ответы на ваши вопросы по C++

Если при чтении книги у вас возникнут вопросы, с нами легко связаться по email:

[email protected]

И через форму обратной связи на сайте:

https://deitel.com/contact-us

Мы оперативно ответим.

В интернете очень много информации о программировании. Например, бесценным ресурсом как для программистов, так и для всех интересующихся является сайт Stack Overflow:

https://stackoverflow.com

На этом сайте вы можете:

• искать ответы на самые распространенные вопросы о программировании;

• искать сообщения об ошибках, чтобы узнать их причину;

• задавать вопросы о программировании, чтобы получать ответы от программистов со всего мира;

• приобретать ценные знания о программировании в целом.

Собеседников на темы C++ вы найдете на канале cpplang в мессенджере Slack:

https://cpplang-inviter.cppalliance.org

и на Discord-сервере #include<C++>:

https://www.includecpp.org/discord

Онлайн-документация по C++

На этом сайте опубликована документация к стандартной библиотеке C++:

https://cppreference.com

А здесь вы можете ознакомиться с ответами на частые вопросы по C++:

https://isocpp.org/faq

О библиотеке форматирования текста {fmt}

На протяжении всей книги мы включили во многие программы следующую строку кода:

#include <fmt/format.h>

Она позволяет нашим программам использовать средства форматирования текста, предоставляемые библиотекой с открытым исходным кодом {fmt}28. В этих программах есть вызовы функции fmt::format.

Новые средства форматирования текста, включенные в C++20, аналогичны той части библиотеки {fmt}, которая используется в наших программах. Поэтому при работе с компилятором, который уже полностью поддерживает стандарт C++20, предыдущую строку кода можно заменить следующей:

#include <format>

В этом случае надо использовать вызовы функции std::format