Современное программирование на C++

С++03/С++11/С++14/С++17/С++20/С++23/С++26
Этот курс открытого доступа предназначен для тех, кто уже знаком с C и объектно-ориентированным программированием и достигает уровня владения программированием на C++. Курс охватывает основы программирования на C++ и переходит к продвинутой семантике и концепциям C++.
Ключевые особенности :
- Бесплатно и часто обновляется
- 26 лекций, 1800+ слайдов
- Включить последние концепции и функции стандарта языка.
- Практическое обучение : неподробные, короткие структурированные описания, связанные с кодом.
- Минимальные примеры кода для демонстрации только конкретной функции или проблемы, не отвлекаясь от темы.
- Дополнительные языковые аспекты : инструменты, соглашения о кодировании, организация проекта и оптимизация кода.
- Основано на опыте : многие аспекты, примеры и проблемы взяты из реальных случаев, с которыми я столкнулся во время моей работы инженером-программистом.
Если вам понравился курс или вы считаете его полезным , пожалуйста, добавьте звезду
ГЛАВЫ
| # | ЗАГОЛОВОК | ГЛАВНОЕ НАПРАВЛЕНИЕ |
|---|
| 1 | Введение (html) | История C/C++, Области применения, Введение в курс |
| 2 | Подготовка (html) | Книги, Как собрать, Привет, мир |
| 3 | Основные понятия I (html) | Система типов, основные типы и операторы |
| 4 | Основные понятия II (html) | Целочисленные типы и типы с плавающей запятой и их арифметика |
| 5 | Основные понятия III (html) | Сущности, перечислители, структуры, операторы потока управления |
| 6 | Основные понятия IV (html) | Куча, стек, указатели, ссылки, константные свойства, операторы преобразования |
| 7 | Основные понятия V (html) | Функции, лямбда-выражения, директивы предварительной обработки |
| 8 | Объектно-ориентированное программирование I (html) | Иерархия классов, конструктор, деструктор, ключевые слова класса. |
| 9 | Объектно-ориентированное программирование II (html) | Полиморфизм, перегрузка операторов |
| 10 | Шаблоны и метапрограммирование I (html) | Шаблон функции, свойства типа, утилиты времени компиляции |
| 11 | Шаблоны и метапрограммирование II (html) | Шаблон класса, SFINAE |
| 12 | Единицы перевода I (html) | Связь и одно правило определения |
| 13 | Единицы перевода II (html) | Работа с несколькими единицами перевода и файлами, #include , Модули |
| 14 | Соглашения кода I (html) | Организация проекта, введение в соглашения о коде, соглашения о сущностях |
| 15 | Соглашения о коде II (html) | Шаблон, пространство имен, современный C++, удобство сопровождения, соглашения об именовании и форматировании |
| 16 | Отладка и тестирование (html) | Отладка выполнения/памяти, Санитайзеры, Методы Хардинга, Модульное тестирование, Разработка через тестирование |
| 17 | Экосистема (html) | Cmake, документирование и другие инструменты |
| 18 | Утилиты (html) | Основные std библиотеки |
| 19 | Контейнеры, итераторы и алгоритмы (html) | Контейнеры, итераторы, алгоритмы, диапазоны |
| 20 | Расширенные темы I (html) | Семантика перемещения, универсальная ссылка, выведение типов |
| 21 | Расширенные темы II (html) | Обработка ошибок, идиомы C++, интеллектуальные указатели |
| 22 | Оптимизация производительности I (html) | Закон Ахмдала, границы производительности, концепции архитектуры (ILP, SIMD и т. д.), иерархия памяти |
| 23 | Оптимизация производительности II (html) | Арифметическая оптимизация, оптимизация памяти и т. д. |
| 24 | Оптимизация производительности III (html) | Оптимизация компилятора, профилирование, инструменты сравнительного анализа |
| 25 | Проектирование программного обеспечения I (html) | Основные понятия, принципы, варианты использования |
| 26 | Проектирование программного обеспечения II (html) | Шаблоны проектирования и идиомы |
Универсальная книга : Modern-cpp.pdf (может быть несколько коммитов позади), html
ТЕМЫ ПОДРОБНО
1. Введение
- Немного истории языков программирования C/C++
- Области применения и популярность
- Философия С++
- Слабые стороны C++ : альтернативы C++. Почему сложно перейти на новый язык?
- Курс
2. Подготовка
- Книги и ссылки
- Легенда слайда
- Какой редактор/IDE/компилятор мне следует использовать?
- Как скомпилировать?
- Привет, мир : поток ввода-вывода
3. Основные понятия I – система типов, фундаментальные типы и операторы.
- Система типов C++ : категории типов, свойства типов.
- Обзор основных типов C++ : арифметические типы, суффикс и префикс, нестандартные арифметические типы, тип
void , nullptr - Правила конвертации
-
auto Ключевое слово - Операторы C++ : приоритет операторов, семантика префиксного/постфиксного увеличения/уменьшения, операторы присваивания, составные операторы и запятые, оператор космического корабля
<=> , операторы безопасного сравнения.
4. Основные понятия II – целочисленные типы и типы с плавающей запятой
- Целочисленные типы данных : целые числа фиксированной ширины,
size_t , ptrdiff_t , uintptr_t , семантика арифметических операций, продвижение, усечение, неопределенное поведение, арифметика насыщения. - Типы и арифметика с плавающей запятой : стандарт IEEE с плавающей запятой и другие представления, нормальные/ненормальные значения, бесконечность, не число (
NaN ), машинный эпсилон, единицы измерения в последнем месте (ULP), шпаргалка, пределы и полезные функции, арифметика свойства, поведение специальных значений, неопределенное поведение, обнаружение ошибок с плавающей запятой - Проблемы с плавающей запятой : катастрофическая отмена, сравнение с плавающей запятой.
5. Основные понятия III – сущности и поток управления
- Сущности
- Декларация и определение
- Счетчики
-
struct , битовое поле, union - Поток управления : оператор
if , циклы for и while , базовый диапазон for цикла, switch , goto , избежание предупреждения о неиспользуемой переменной. - Пространство имен : явное глобальное пространство имен, псевдоним пространства имен,
using -декларации, using namespace , inline пространство имен. - Атрибуты :
[[nodiscard]] , [[maybe_unused]] , [[deprecated]] , [[noreturn]]
6. Основные понятия IV. Концепции памяти.
- Указатели : операции с указателями, оператор адреса
& , доступ к членам struct , void указатель, преобразование указателей, арифметика указателей, дикие и висячие указатели. - Куча и стек : стековая память,
new , delete , размещение без выделения, выделение без выбрасывания, утечка памяти. - Инициализация : инициализация переменной, унифицированная инициализация, инициализация массива, инициализация структуры, привязка структуры, инициализация динамической памяти.
- Ссылки
-
Const и константные выражения : константы и литералы, const , constexpr , consteval , constinit , if constexpr , std::is constant evaluated() , if consteval -
volatile ключевое слово - Явное преобразование типов :
static_cast , const_cast , reinterpret_cast , каламбур типов, std::bit_cast , унифицированное преобразование инициализации, gls::narrow_cast - Оператор
sizeof : обзор, [[no_unique_address]]
7. Основные понятия V – Функции и предварительная обработка
- Функции : передача по значению, передача по указателю, передача по ссылке, сигнатура функции и перегрузка, перегрузка и
=delete , параметры по умолчанию. - Указатель функции и функциональные объекты
- Лямбда-выражения : список захвата, связь лямбда-выражений и функций, примечания к параметрам, компонуемость, рекурсия,
constexpr/consteval , template , mutable , [[nodiscard]] , список захвата и классы - Предварительная обработка : препроцессоры, распространенные ошибки, макросы расположения исходного кода, макросы условной компиляции, оператор строкирования (
# ), #error и #warning , #pragma , оператор вставки токена ## , Variadic макрос
Глава 8. Объектно-ориентированное программирование I. Концепции классов.
- Классы C++ : идиома RAII
- Иерархия классов
- Спецификаторы доступа : Спецификаторы доступа к наследованию. При использовании
public/protected/private для элементов данных? - Конструктор класса : конструктор по умолчанию, инициализация класса, унифицированная инициализация объектов, конструктор делегата,
explicit ключевое слово, [[nodiscard]] и классы. - Копировать конструктор
- Деструктор класса
- Конструкторы, деструктор и операторы по умолчанию (
= default ) - Ключевые слова класса :
this , static , const , mutable , using , friend , delete
Глава 9. Объектно-ориентированное программирование II. Полиморфизм и перегрузка операторов.
- Полиморфизм : механизмы C++ для полиморфизма,
virtual методы, виртуальная таблица, ключевое слово override , ключевое слово final , распространенные ошибки, чистый виртуальный метод, абстрактный класс и интерфейс. - Приведение наследования и идентификация типов во время выполнения
- Перегрузка операторов : обзор, оператор сравнения
< , оператор космического корабля <=> , индексный оператор [] , многомерный индексный оператор [] , оператор вызова функции () , статические операторы [] и оператор () , оператор преобразования T() , перегрузка возвращаемого типа разрешение, Операторы увеличения и уменьшения ++ / -- , Оператор присваивания = , Потоковый оператор << , Примечания для оператора - Макет объекта C++ : агрегатный класс, тривиальный класс, класс стандартного макета, простые старые данные (POD), иерархия.
10. Шаблоны и метапрограммирование. I. Шаблоны функций и утилиты времени компиляции.
- Шаблон функции : обзор, создание экземпляра шаблона, параметры шаблона, параметр шаблона — значение по умолчанию, перегрузка, специализация
- Переменная шаблона
- Типы параметров шаблона : общие примечания к типам,
auto заполнитель, тип параметра шаблона класса, типы массивов и указателей, тип функции. - Утилиты времени компиляции :
static_assert , ключевое слово using , ключевое слово decltype . - Типовые черты : обзор, библиотека типовых черт, манипулирование типами
11. Шаблоны и метапрограммирование II – Шаблоны классов и SFINAE
- Шаблон класса : специализация класса, конструктор шаблона класса.
- Автоматический вывод шаблона конструктора (CTAD)
- Шаблон класса — расширенные понятия : класс + функция — специализация, зависимые имена —
typename и ключевые слова template , иерархия и using шаблона класса, ключевое слово friend , аргументы шаблона шаблона - Метапрограммирование шаблонов
- SFINAE: ошибка замены не является ошибкой : функция SFINAE, класс SFINAE
- Шаблон Variadic : складное выражение, шаблон класса Variadic.
- Концепции C++20 : обзор, ключевое слово
concept , предложение requires , выражение requires , выражение requires + предложение, requires предложение + выражение, requires и constexpr , вложенные requires - Отладка шаблонов
12. Единицы перевода I – Связь и одно правило определения
- Основные понятия : единица перевода, локальная и глобальная область действия, связь.
- Класс и продолжительность хранения : продолжительность хранения, класс хранения,
static ключевое слово, анонимное пространство имен, extern ключевые слова. - Связь
const и constexpr : фиаско порядка статической инициализации - Сводная информация о связях
- Работа с несколькими единицами перевода : Класс в нескольких единицах перевода
- Одно правило определения (ODR) : проблемы с глобальными переменными, ODR – пункт 3,
inline функции/переменные, constexpr и inline - ODR – шаблон функции : случаи, ключевое слово
extern - ODR – шаблон класса : случаи, ключевое слово
extern - Неопределенное поведение и сводка ODR
13. Единицы перевода II — включение, модуль и пространство имен
- Проблемы
#include : защита включения, предварительное объявление, циклические зависимости, распространенные ошибки связывания. - Модули C++20 : обзор, терминология, видимость и доступность, типы модулей модуля, ключевые слова, фрагмент глобального модуля, фрагмент частного модуля, модуль заголовка, разделы модуля.
- Компиляция нескольких единиц перевода : основные флаги компилятора, методы компиляции
- Библиотеки на C++ : Статическая библиотека, Сборка статических библиотек, Использование статических библиотек, Динамическая библиотека, Сборка динамических библиотек, Использование динамических библиотек, Двоичный интерфейс приложения (ABI), Демонтаж, Поиск зависимостей динамических библиотек, Анализ объектов/исполняемых символов
14. Соглашения по кодексу I
- Организация проекта C++ : каталоги проектов, файлы проектов, «общие» заметки об организации проекта, альтернатива — «каноническая» организация проекта.
- Стили и соглашения кодирования : обзор, популярные стили кодирования
- Файлы заголовков и
#include : #include Guard, синтаксис #include , порядок #include , общие соглашения об именах заголовков и исходных файлов. - Предварительная обработка : макросы, операторы предварительной обработки.
- Переменные :
static глобальные переменные, преобразования. - Счетчики
- Арифметические типы : целочисленные типы со знаком и без знака, преобразование целочисленных типов, целочисленные типы: размер и другие проблемы, типы с плавающей запятой.
- Функции : параметры функции, аргументы функции, возвращаемые значения функции, спецификаторы функции, лямбда-выражения.
- Структуры и классы :
struct против class , инициализация, списки инициализаторов в фигурных скобках, специальные функции-члены, =default , =delete , другие проблемы, наследование, стиль
15. Соглашения о кодексе II
-
auto - Шаблоны и вывод типов
- Поток управления : избыточный поток управления,
if/else , сравнение, switch , for/while - Пространство имен :
using namespace , Анонимное/безымянное пространство имен, Дизайн пространства имен и классов, Стиль - Современные возможности C++ : ключевые слова, функции, класс, библиотека
- Удобство сопровождения : понимание кода, функции, шаблон и дебукция, библиотека.
- Портативность
- Именование : объекты, переменные, функции, соглашения о стилях, соблюдение стилей именования.
- Читабельность и форматирование : горизонтальный интервал, указатели/ссылки, вертикальный интервал, фигурные скобки, декораторы типов, уменьшение многословности кода, другие проблемы.
- Документация по коду : документация по функциям, синтаксис комментариев, документация по файлам.
16. Отладка и тестирование
- Обзор отладки
- Утверждения
- Отладка выполнения : точки останова, точки наблюдения/точки контроля, поток управления, стек и информация, печать, дизассемблирование,
std::breakpoint - Отладка памяти :
valgrind - Методы усиления защиты : использование стека, проверки стандартных библиотек, защита от неопределенного поведения, защита потока управления.
- Дезинфицирующие средства : дезинфицирующее средство для адресов, дезинфицирующее средство для утечек, дезинфицирующее средство для памяти, дезинфицирующее средство неопределенного поведения, дезинфицирующее средство на основе выборки.
- Сводка отладки
- Предупреждения компилятора
- Статический анализ
- Тестирование кода : модульное тестирование, разработка через тестирование (TDD), покрытие кода, нечеткое тестирование.
- Качество кода :
clang-tidy
17. Экосистема — Cmake и другие инструменты
- CMake :
cmake и ctest - Документация по коду :
doxygen - Статистика кода : подсчет строк кода, цикломатический анализатор сложности.
- Другие инструменты : форматирование кода —
clang-format , Compiler Explorer , преобразование кода — CppInsights , завершение кода на основе искусственного интеллекта — локальный поиск кода — ugrep , ripgrep , hypergrep , поисковая система кода — searchcode/grep.app , бенчмаркинг кода — Quick-Bench , Шрифт для кодирования
18. Утилиты
- Поток ввода-вывода : Манипулятор,
ofstream/ifstream - Строки :
std::string , Преобразование из/в числовые значения, std::string_view , std::format , std::print - Вид :
std::span - Математические библиотеки
- Случайное число : основные понятия, C++
<random> , начальное значение, период и качество PRNG, распределение, последние алгоритмы и производительность, квазислучайное число. - Измерение времени : время настенных часов, время пользователя, системное время.
- Шаблоны классов Std :
std::pair , std::tuple , std::variant , std::optional , std::any , std::stacktrace . - Библиотека файловой системы : методы запроса, методы изменения.
19. Контейнеры, итераторы и алгоритмы
- Контейнеры и итераторы
- Контейнеры последовательностей :
std::array , std::vector , std::deque , std::list , std::forward_list . - Ассоциативные контейнеры :
std::set , std::map , std::multiset - Адаптеры контейнеров :
std::stack , std::queue , std::priority_queue - Реализация пользовательского итератора : реализация простого итератора
- Примечания к итератору :
- Служебные методы итератора :
std::advance , std::next , std::prev , std::distance , методы доступа к контейнеру, особенности итератора. - Библиотека алгоритмов :
std::find_if , std::sort , std::accumulate , std::generate , std::remove_if - Диапазоны C++20 : Ключевые понятия, Представление диапазона, Адаптер диапазона, Фабрика диапазона, Алгоритмы диапазона, Действия с диапазоном
20. Продвинутые темы I
- Семантика перемещения : ссылки на
lvalues и rvalues , семантика перемещения, std::move , семантика объявления класса. - Универсальная ссылка и идеальная пересылка : универсальная ссылка, правила свертывания ссылок, идеальная пересылка.
- Категории значений
-
& , && Ref-квалификаторы и volatile перегрузка - Копирование Elision и RVO
- Вывод типа : передача по ссылке, передача по указателю, передача по значению,
auto вывод, auto(x) : копирование с затуханием -
const Корректность
21. Продвинутые темы II
- Неопределенное поведение: незаконное поведение, поведение, специфичное для платформы, неопределенное поведение, обнаружение неопределенного поведения.
- Обработка ошибок : обработка устранимых ошибок, код возврата, исключения C++, определение пользовательских исключений, ключевое слово
noexcept , проблемы с распределением памяти, код возврата и сводка исключений, std::expected , альтернативные подходы к обработке ошибок - Интеллектуальные указатели :
std::unique_ptr , std::shared_ptr , std::weak_ptr - Параллелизм : методы потоков, мьютекс, атомарный параллелизм, параллелизм на основе задач.
22. Оптимизация I – Основные понятия
- Введение : Закон Мура, ограничения закона Мура, причины оптимизации.
- Основные понятия : асимптотическая сложность, компромисс между временем и памятью, цикл разработки, закон Ахмдала, пропускная способность, пропускная способность, задержка, границы производительности, арифметическая интенсивность.
- Основные понятия архитектуры : пропускная способность инструкций (IPC), упорядоченное и внеочередное выполнение, конвейерная обработка инструкций, параллелизм на уровне инструкций (ILP), закон Литтла, параллелизм на уровне данных (DLP) и векторные инструкции (SIMD). Параллелизм на уровне потоков (TLP), многопоточность с одной инструкцией (SIMT), RISC, наборы инструкций CISC
- Иерархия памяти : концепции иерархии памяти, локальность памяти, задержка между ядрами и сходство потоков, модель упорядочивания памяти.
23. Оптимизация II — Оптимизация кода
- Операции ввода-вывода :
printf , ввод-вывод с отображением в памяти, ускорение загрузки необработанных данных. - Оптимизация памяти : динамическая память, стековая память, использование кэша, выравнивание данных, предварительная выборка памяти.
- Арифметические типы : типы данных, арифметические операции, преобразование, числа с плавающей запятой, встроенные функции компилятора, значение в диапазоне, таблица поиска.
- Поток управления : ветки, подсказки ветвей -
[[likely]] / [[unlikely]] , целые числа со знаком/без знака, циклы, подъем цикла, развертывание цикла, утверждения, подсказки компилятора [[assume]]/std::unreacheable() , Рекурсия - Функции : стоимость вызова функции, передача аргументов, встраивание функций, атрибуты функций, псевдонимы указателей.
- Объектно-ориентированное программирование
- Стандартная библиотека и другие языковые аспекты
24. Оптимизация III. Оптимизация без кодирования и сравнительный анализ.
- Оптимизация компилятора : О компиляторе, Флаги оптимизации компилятора, Флаги оптимизации с плавающей запятой, Флаги оптимизации компоновщика, Флаги архитектуры, Помощь компилятору в создании лучшего кода, Оптимизация на основе профиля (PGO), Бинарный оптимизатор постобработки, Многогранная оптимизация
- Методы преобразования компилятора : базовые преобразования, отключение циклов, слияние циклов, деление циклов, обмен циклами, мозаика циклов.
- Библиотеки и структуры данных
- Бенчмаркинг производительности : что тестировать?, Качество рабочей нагрузки/набора данных, Поведение кэша, Стабильная производительность ЦП, Особенности многопоточности, Структура программной памяти, Накладные расходы на измерения, Оптимизация компилятора, Оценка показателей
- Профилирование :
gprof , uftrace , callgrind , cachegrind , perf профилировщик Linux. - Параллельные вычисления : параллелизм и параллелизм, масштабирование производительности, закон Густавсона, языки параллельного программирования
25. Проектирование программного обеспечения I – Основные понятия (ПРОЕКТ)
- Книги и ссылки
- Основные понятия : абстракция, интерфейс и модуль, инвариант класса.
- Принципы проектирования программного обеспечения : разделение задач, низкая связанность, высокая связность, инкапсуляция и сокрытие информации, проектирование по контракту, декомпозиция проблемы, повторное использование кода.
- Сложность программного обеспечения : энтропия программного обеспечения, технический долг.
- Принципы проектирования SOLID
- Проектирование классов : принцип интерфейса класса, функции-члены и свободные функции, функции пространства имен и статические методы класса.
- Практический пример BLAS GEMM
- Владение объектами и представлениями
- Значение и ссылочная семантика
- Глобальные переменные
26. Проектирование программного обеспечения II – Шаблоны проектирования и идиомы (ПРОЕКТ)
- Идиомы C++ : правило нуля, правило трех, правило пяти.
- Шаблон проектирования : синглтон, указатель на реализацию (PIMPL), любопытно повторяющийся шаблон шаблона (CRTP), виртуальные функции шаблона.
Дорожная карта
- Главы по улучшению проектирования программного обеспечения
- Глава «Аспекты сборки» (например, сокращение времени сборки)
Сообщать об ошибках? и внося свой вклад
Если вы обнаружите какую-либо опечатку, концептуальную ошибку или раздел, который нужно улучшить, сообщите о них, используя панель issue .
Автор
Federico Busato , https://federico-busato.github.io/
- LinkedIn: www.linkedin.com/in/federico-busato/
- Твиттер: twitter.com/fedebusato