Современное программирование на 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