Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Программисты с опытом работы на других языках высокого уровня смогут на практике освоить современный С++ и «большую четверку» его новых возможностей: диапазоны, концепты, модули и корутины. 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:
Seitenzahl: 1527
Veröffentlichungsjahr: 2024
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Переводчики В. Здобнов, М. Фатеев
Пол Дейтел, Харви Дейтел
C++20 для программистов. — СПб.: Питер, 2024.
ISBN 978-5-4461-2359-9
© ООО Издательство "Питер", 2024
Добро пожаловать в «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++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. Компилируйте и запускайте соответствующие программы во время чтения книги, чтобы сделать учебный процесс более наглядным. Если у вас возникнут проблемы, вы можете связаться с нами по адресу:
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 предоставляет программистам 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 Notation).
Прекрасный пример метода готовых объектов — использование объектов таких стандартных классов 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++» рассказывает о том, что должен знать каждый профессиональный программист. В этой главе вы найдете:
• краткое введение;
• обсуждение закона Мура, многоядерных процессоров и необходимости стандартизированного конкурентного программирования в современном 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 продемонстрирует шифрование с закрытым ключом.
В главе 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 посвящен регулярным выражениям, которые нужны для поиска и замены фрагментов текста.
В главе 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), что позволит компилятору оптимизировать исполняемый код и избежать сложных ресурсоемких операций, связанных с обработкой исключений.
В главе 13 «Контейнеры и итераторы стандартной библиотеки» начинается более широкое и глубокое рассмотрение трех ключевых компонентов стандартной библиотеки языка C++:
• контейнеров (основанных на шаблонах структур данных);
• итераторов (необходимых для доступа к элементам контейнеров);
• алгоритмов (использующих итераторы для обработки контейнеров).
Мы обсудим контейнеры, а также адаптеры контейнеров и псевдоконтейнеры. Вы увидите, что стандартная библиотека C++ предоставляет вам готовые структуры данных, широко применяемые программистами, поэтому вам не нужно создавать свои собственные. Почти все связанные со структурами данных задачи, которые вам могут встретиться, вы сможете решить средствами стандартной библиотеки. Мы продемонстрируем большинство контейнеров стандартной библиотеки и объясним, как применять алгоритмы к различным типам контейнеров, используя итераторы. Вы увидите, что разные контейнеры поддерживают разные типы итераторов. Мы продолжим показывать те ценные возможности упрощения кода, которые дает программисту введенная в C++20 библиотека ranges.
В главе 14 «Алгоритмы стандартной библиотеки, диапазоны и представления C++20» представлены многие из 115 алгоритмов стандартной библиотеки. В центре внимания — типичные операции с контейнерами, в том числе заполнение контейнеров значениями, генерация значений, сравнение элементов и целых контейнеров, удаление элементов, замена элементов, математические операции, поиск, сортировка, обмен значениями, копирование, объединение, операции со множествами, определение границ контейнеров, нахождение наименьших и наибольших значений. Мы обсудим минимальные требования к итераторам, чтобы вы знали, какие контейнеры совместимы с тем или иным алгоритмом. Мы начинаем обсуждение концептов, входящих в «большую четверку» новых возможностей C++20. Алгоритмы из пространства имен std::ranges (C++20) используют концепты, чтобы проверять корректность получаемых аргументов. Мы продолжим обсуждение функционального программирования на примере диапазонов и представлений C++20.
В главе 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 по адресу:
https://deitel.com/c-plus-plus-20-for-programmers
На этой странице вы найдете следующие дополнительные материалы:
• ссылки на наш репозиторий на портале GitHub, содержащий все примеры исходного кода из этой книги в виде загружаемых файлов;
• посты в блоге: https://deitel.com/blog;
• обновления к книге.
Рекомендации по загрузке файлов и по настройке вашей среды разработки программ на C++ приведены в разделе «Перед началом работы».
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.
В 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, поэтому это отличное место, чтобы искать решения таких проблем и задавать новые вопросы. В ходе работы над книгой многие из наших поисковых запросов в Google на различные темы, зачастую сложные, приводили среди первых результатов ответы на Stack Overflow.
Лучший способ подготовиться [к работе программиста] — это писать программы и изучать замечательные программы, написанные другими людьми. В моем случае я ходил к мусорным корзинам в Центре компьютерных наук и вылавливал из них листинги операционных систем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, содержащие:
• пакет компиляторов GNU Compiler Collection (GCC), в состав которого входит компилятор g++;
• последнюю версию компилятора clang++ от команды разработчиков Clang.
Эти контейнеры работают в Docker на компьютерах с Windows, macOS и Linux.
Docker способствует воспроизводимости результатов. В контейнерах Docker вы можете сохранять ваши настроенные конфигурации со всеми программами и библиотеками, которые используете. Это позволит другим программистам полностью воссоздавать вашу рабочую среду, а затем точно повторять вашу работу. И вы тоже сможете таким образом стабильно воспроизводить ваши собственные результаты. Воспроизводимость особенно важна в науке и в медицине, например, когда исследователи хотят подтвердить и расширить результаты работ, изложенные в опубликованных статьях.
В книгу включены сотни ссылок на видеоролики, записи в блогах, статьи и онлайн-справочники, которые мы изучали, работая над книгой. Возможно, вы захотите обратиться к некоторым из этих ресурсов для изучения более сложных языковых средств и идиом. Основным сборником документации по 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.
Если при чтении книги у вас возникнут вопросы, вы можете связаться с нами по адресу:
Мы оперативно ответим.
Мы благодарим Барбару Дейтел (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, автор книги «Professional 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 за то, что он позволяет нам легко делиться своим кодом и поддерживать его в актуальном состоянии, а также за предоставление инструментов, которые позволяют десяткам миллионов разработчиков вносить свой вклад в сотни миллионов репозиториев исходного кода19. Эти инструменты помогают всемирному сообществу разработчиков открытого программного обеспечения, предоставляющему библиотеки для популярных языков программирования, упростить создание мощных приложений и избавить коллег от необходимости «изобретать велосипед».
Благодарим Мэтта Годболта (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, чья поисковая система отвечает на наш постоянный поток запросов, выполняя каждый из них за доли секунды, в любое время дня и ночи, причем совершенно бесплатно. Это лучший инструмент повышения производительности труда, который мы добавили в наш исследовательский процесс за последние 20 лет!
Теперь мы используем платную версию Grammarly для проверки всех наших рукописей. Разработчики этого сервиса отмечают, что он помогает «писать ярко, понятно, без ошибок», пользуясь «текстовым помощником на основе искусственного интеллекта»20. Они также утверждают: «Используя различные инновационные подходы, в том числе передовое машинное обучение и глубокое обучение, мы постоянно открываем новые возможности в области обработки естественного языка (NLP), чтобы предоставлять непревзойденную помощь»21.
Grammarly предлагает бесплатные инструменты, которые можно интегрировать в несколько популярных веб-браузеров, а также в Microsoft® Office365™ и в Google Docs™. В дополнение к этому предлагаются более мощные премиум-инструменты и версия для бизнеса. Здесь вы можете узнать о разных вариантах бесплатного и платного использования сервиса:
https://www.grammarly.com/plans
Мы будем благодарны за ваши замечания, критику, исправления и предложения по улучшению книги, если таковые появятся у вас при чтении книги. Всю корреспонденцию, включая вопросы, мы просим направлять по адресу:
Мы оперативно ответим.
Мы приглашаем вас в захватывающий мир программирования на 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
Если вы работаете в 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, который может занять много времени, особенно если у вас относительно медленное интернет-соединение.
На компьютере с macOS выполните следующие шаги для установки Xcode.
1. Откройте меню Apple и выберите пункт App Store... (или нажмите на значок App Store в нижней панели).
2. В строке поиска App Store наберите: Xcode.
3. Нажмите кнопку Get, чтобы установить Xcode.
Существует множество дистрибутивов Linux, в которых используются разные методы обновления программ. Обратитесь к онлайн-документации вашего дистрибутива, чтобы узнать, как правильно обновить GNU C++ до последней версии. Вы также можете загрузить GNU C++ для разных платформ по адресу:
https://gcc.gnu.org/install/binaries.html
Если вы хотите установить 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 (обычно на сайте https://hub.docker.com), которые вы можете загрузить и запустить локально на своем компьютере. 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
Команда разработчиков 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++.
В настоящее время у команды разработчиков 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++.
Если при чтении книги у вас возникнут вопросы, с нами легко связаться по email:
И через форму обратной связи на сайте:
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++:
https://cppreference.com
А здесь вы можете ознакомиться с ответами на частые вопросы по C++:
https://isocpp.org/faq
На протяжении всей книги мы включили во многие программы следующую строку кода:
#include <fmt/format.h>
Она позволяет нашим программам использовать средства форматирования текста, предоставляемые библиотекой с открытым исходным кодом {fmt}28. В этих программах есть вызовы функции fmt::format.
Новые средства форматирования текста, включенные в C++20, аналогичны той части библиотеки {fmt}, которая используется в наших программах. Поэтому при работе с компилятором, который уже полностью поддерживает стандарт C++20, предыдущую строку кода можно заменить следующей:
#include <format>
В этом случае надо использовать вызовы функции std::format