Современный курс по C++
Этот учебник призван предоставить опытным разработчикам краткую справку по новым функциям C++11/14/17/20. Охватывает улучшения удобства использования языка, повышение производительности во время выполнения, новые контейнеры, умные указатели и управление памятью, регулярные выражения, параллельное программирование и обзор C++20.
Обзор курса
📚 Краткое содержание
Этот учебник предназначен для опытных разработчиков и служит краткой справкой по новым возможностям языка C++11/14/17/20. В материале рассматриваются улучшения удобства использования языка, повышение производительности во время выполнения, использование новых контейнеров, умные указатели и управление памятью, регулярные выражения, параллельное программирование, а также обзор языковых возможностей C++20.
Быстро освойте возможности C++11/14/17/20 и пройдите порог современного программирования на языке С++.
Автор: Оу Чанькун (Ou Changkun)
Благодарности: Лицензировано по лицензии CC BY-NC-ND 4.0, благодарность всем участникам проекта на GitHub и связанным сообществам.
🎯 Цели обучения
- Определить и проверить среду компиляции C++ и целевую архитектуру с помощью командной строки.
- Объяснить совместимость стандартов и исторические пересечения между языками С (C89, C99, C11) и С++ (С++98, С++1x).
- Реализовать функциональную межязыковую связь с использованием заголовочных файлов
extern "C"и многоэтапных процессов компиляции. - Устранить неоднозначность указателей с помощью
nullptrи реализовать логику на этапе компиляции с помощьюconstexprиif constexpr. - Упростить сложные объявления с помощью
auto,decltypeи псевдонимов типов (using), одновременно обеспечив надёжный объектно-ориентированный дизайн с помощьюoverrideиfinal. - Разработать высоконагрузочные универсальные алгоритмы с помощью переменных шаблонов, выражений свёртки и вывода параметров шаблонов без типа.
- Определить и реализовать выражения-ламбды с различными режимами захвата (по значению, по ссылке, по выражению, по общему виду).
- Использовать
std::functionиstd::bindдля создания гибких обёрток функций и частичного применения функций. - Классифицировать выражения как л-значения (Lvalues), промежуточные значения (Prvalues) и временные значения (Xvalues), применяя семантику перемещения для оптимизации управления ресурсами классов.
- Отличать модели памяти и области применения
std::array(фиксированный размер, стек) иstd::vector(динамический размер, куча).
🔹 Урок 1: Историческое развитие С++ и среда разработки
Обзор: Этот урок охватывает техническую основу среды разработки С++ и её историческую связь с языком С. Он подробно рассматривает пересечение стандартов С++ (С++98 — С++1x) и стандартов С (С89 — С11), а также конкретные механизмы, такие как extern "C", необходимые для успешной компиляции и связывания смешанных кодов на С и С++.
Результаты обучения:
- Определить и проверить среду компиляции С++ и целевую архитектуру с помощью командной строки.
- Объяснить совместимость стандартов и исторические пересечения между С (С89, С99, С11) и С++ (С++98, С++1x).
- Реализовать функциональную межязыковую связь с использованием заголовочных файлов
extern "C"и многоэтапных процессов компиляции.
🔹 Урок 2: Удобство языка: современный синтаксис и шаблоны
Обзор: Этот урок исследует эволюцию С++ от С++11 до С++20, фокусируясь на улучшениях, повышающих читаемость кода, безопасность типов и гибкость шаблонов. Учащиеся освоят современные синтаксические особенности, такие как вывод типов, вычисления на этапе компиляции с помощью constexpr, а также продвинутые техники шаблонов, включая переменные шаблоны и выражения свёртки.
Результаты обучения:
- Устранить неоднозначность указателей с помощью
nullptrи реализовать логику на этапе компиляции с помощьюconstexprиif constexpr. - Упростить сложные объявления с помощью
auto,decltypeи псевдонимов типов (using), при этом обеспечив надёжный объектно-ориентированный дизайн с помощьюoverrideиfinal. - Разработать высоконагрузочные универсальные алгоритмы с помощью переменных шаблонов, выражений свёртки и вывода параметров шаблонов без типа.
🔹 Урок 3: Улучшения времени выполнения: лямбды и семантика перемещения
Обзор: Этот урок охватывает ключевые улучшения времени выполнения, введённые в современном С++ (С++11/14), с акцентом на функциональные конструкции и эффективное управление ресурсами. Учащиеся освоют выражения-лямбды — включая генерические лямбды С++14 и захват по выражению — и углубятся в механику семантики перемещения, категорий значений (Л-значения/П-значения) и идеального передачи параметров, чтобы исключить ненужные глубокие копии в высокопроизводительных приложениях.
Результаты обучения:
- Определить и реализовать выражения-лямбды с различными режимами захвата (по значению, по ссылке, по выражению, по общему виду).
- Использовать
std::functionиstd::bindдля создания гибких обёрток функций и частичного применения функций. - Классифицировать выражения как л-значения (Lvalues), промежуточные значения (Prvalues) и временные значения (Xvalues), применяя семантику перемещения для оптимизации управления ресурсами классов.
🔹 Урок 4: Современные контейнеры: std::array
Обзор: Этот урок знакомит с std::array — контейнером, представленным в С++11 как современная альтернатива традиционным массивам С-стиля. Рассматриваются преимущества использования контейнера фиксированного размера, который инкапсулирует сырые массивы, предоставляя более безопасный интерфейс, совместимый со STL, и выделение памяти на стеке.
Результаты обучения:
- Отличать модели памяти и области применения
std::array(фиксированный размер, стек) иstd::vector(динамический размер, куча). - Правильно инициализировать и управлять
std::arrayс помощью методов, таких как.size()и.empty(). - Применять алгоритмы библиотеки стандартных шаблонов (STL) и циклы по диапазонам к объектам
std::array.
🔹 Урок 5: Умные указатели и управление памятью по принципу RAII
Обзор: Этот урок представляет философию управления памятью в современном С++ — «приобретение ресурса при инициализации» (RAII). Рассматривается переход от ручного управления указателями к автоматизированному управлению с помощью std::unique_ptr для эксклюзивного владения, std::shared_ptr для разделяемого доступа с подсчётом ссылок и std::weak_ptr для разрыва циклических зависимостей.
Результаты обучения:
- Понимать и применять принцип RAII для обеспечения освобождения ресурсов при выходе из области видимости.
- Реализовывать модели общего и эксклюзивного владения с помощью
std::shared_ptrиstd::unique_ptr. - Выявлять и устранять утечки памяти, вызванные циклическими ссылками, с помощью
std::weak_ptr.
🔹 Урок 6: Регулярные выражения и анализ строк
Обзор: Этот урок описывает реализацию регулярных выражений с использованием стандартной библиотеки С++11 (std::regex) и их практическое применение для анализа HTTP-запросов. Учащиеся узнают синтаксис кванторов регулярных выражений, использование std::smatch для захвата результатов и архитектурную интеграцию этих инструментов в среду веб-сервера на основе шаблонов.
Результаты обучения:
- Определять и применять специальные символы регулярных выражений (кванторы) для определения шаблонов строк.
- Использовать
std::regexиstd::smatchдля проверки имён файлов и извлечения данных из строк. - Реализовать основную логику сервера, включая анализ HTTP-запросов и сопоставление ресурсов с использованием современных моделей памяти и контейнеров С++.
🔹 Урок 7: Параллелизм, многопоточность и модели памяти
Обзор: Этот урок описывает фундаментальный сдвиг в С++11 к стандартизованной модели многопоточности. Переход от базового управления потоками и блокировок на основе RAII к продвинутым примитивам синхронизации, таким как будущие значения (futures) и условные переменные, завершается строгой моделью памяти С++11, операциями атомарности и гарантиями согласованности памяти.
Результаты обучения:
- Управлять жизненным циклом потоков и защищать общие ресурсы с помощью
std::thread,std::mutexи обёрток на основе RAII (std::lock_guard,std::unique_lock). - Реализовывать асинхронные рабочие процессы и общение между потоками с помощью
std::future,std::packaged_taskиstd::condition_variable. - Применять типы
std::atomicи выбирать соответствующие стратегииstd::memory_orderдля обеспечения видимости памяти и предотвращения запрещённой перестановки инструкций.
🔹 Урок 8: Стандартная библиотека: обновления файловой системы
Обзор: Этот урок рассматривает эволюцию стандартной библиотеки С++, с акцентом на высокий уровень функций, введённых в С++11 и последующих стандартах. Подчёркивается переход от платформозависимых или низкоуровневых реализаций к стандартизированным, высокоуровневым средствам, таким как std::filesystem и инструменты параллелизма.
Результаты обучения:
- Определить ключевые компоненты многопоточности, добавленные в стандартную библиотеку в С++11.
- Распознать
std::filesystemкак важное расширение для современного управления путями и файлами. - Понять роль высокоуровневых абстракций в модернизации разработки на С++.
🔹 Урок 9: Дополнительные современные возможности
Обзор: Этот урок охватывает ряд значимых особенностей, введённых в С++11 и усовершенствованных в последующих стандартах, для повышения безопасности типов, производительности и читаемости кода. Учащиеся узнают о типе long long int для расширенной точности целых чисел, спецификациях исключений с помощью noexcept, улучшенных строках и пользовательских литералах, а также тонком контроле выравнивания памяти через alignof и alignas.
Результаты обучения:
- Определить и реализовать тип
long long intдля расширенной точности целых чисел. - Применить спецификатор
noexceptдля оптимизации обработки исключений и использовать операторnoexceptдля проверки безопасности функции. - Использовать сырные строковые литералы для упрощения определения сложных строк и создавать пользовательские литералы для собственных суффиксов типов.
🔹 Урок 10: С++20: Будущее языка
Обзор: Этот урок представляет «четыре главных столпа» С++20: Концепты, Модули, Корутины и Диапазоны. Эти возможности представляют собой наиболее значимое развитие языка после С++11, с фокусом на повышение безопасности шаблонов, эффективность компиляции, асинхронное программирование и обработку данных в функциональном стиле.
Результаты обучения:
- Определить и описать четыре основные особенности, введённые в стандарте С++20.
- Объяснить роль концептов и ограничений в улучшении обработки ошибок шаблонов и проектирования.
- Отличать традиционный подход на основе заголовочных файлов от новой системы модулей.