This lesson is not translated yet – the Russian original is below.
C++ – язык, который не выучивается за один курс. Здесь собрано то, что стоит открыть дальше: по одному источнику на тему, а не всё подряд. Список избыточен намеренно – выбирайте по тому, что сейчас болит.
С чего начать
Три книги закрывают большую часть курса и читаются в разном порядке в зависимости от опыта.
- Бьярне Страуструп, «Программирование. Принципы и практика с использованием C++» (3-е изд., 2024) – если C++ первый или почти первый язык. Толстая, медленная и очень подробная; автор языка объясняет не синтаксис, а способ думать.
- Стэнли Липпман, Жози Лажойе, Барбара Му, «Язык программирования C++. Базовый курс» (5-е изд., 2012) – если опыт в другом языке уже есть. Не учебник для начинающих, а систематическое изложение: то, что в этом курсе занимает урок, там занимает главу.
- Скотт Мейерс, «Эффективный и современный C++» (2014) – 42 разбора конкретных решений:
почему
auto, почемуnullptr, почемуmake_unique. Читается после того, как язык освоен, и переворачивает половину привычек. Именно эта книга лежит в материалах курса.
По модулям курса
- Сборка и структура кода – документация вашей системы сборки. Для CMake это «Modern CMake», для понимания того, что происходит под ней, – Джон Левин, «Linkers and Loaders» (1999).
- Память – Ульрих Дреппер, «What Every Programmer Should Know About Memory» (2007). Длинно и местами устарело в числах, но объясняет, почему плоский массив быстрее массива указателей.
- Структуры и классы – Скотт Мейерс, «Наиболее эффективное использование C++» («More Effective C++», 1996): правило трёх, исключения в конструкторах, копирование – там это разобрано до конца.
- ООП – Роберт Мартин, «Чистая архитектура» (2017) про границы и направление зависимостей, а из курсов платформы – «Объектно ориентированное программирование», где те же механизмы рассматриваются как приёмы проектирования, а не как средства языка.
- Дополнительные возможности – Херб Саттер, «Решение сложных задач на C++»
(«Exceptional C++», 1999): перегрузка операторов,
friend, исключения и безопасность относительно них, в формате «задача – разбор». - Шаблоны – Дэвид Вандевурд, Николай Джосаттис, Дуглас Грегор, «Шаблоны C++. Справочник разработчика» (2-е изд., 2017). Полное изложение; читать целиком не нужно, но за ответом идти стоит именно туда.
Стандарт и справочники
- cppreference.com – основной справочник по языку и стандартной библиотеке. Есть русская версия, но она отстаёт; привыкайте к английской.
- Godbolt Compiler Explorer – показывает ассемблер, в который превращается ваш код, сразу для нескольких компиляторов. Лучший способ проверить, во что обходится виртуальный вызов или встроилась ли функция.
- C++ Core Guidelines – рекомендации Страуструпа и Саттера с объяснением каждой. Не читаются подряд, но по конкретному вопросу дают короткий и обоснованный ответ.
- cppinsights.io – показывает, во что компилятор разворачивает шаблоны, range-for и лямбды. Полезен ровно тогда, когда непонятно, что происходит.
Инструменты, которые стоит поставить сразу
- Санитайзеры.
-fsanitize=addressловит выход за границы, использование освобождённой памяти и утечки;-fsanitize=undefined– переполнение знаковых типов и прочее неопределённое поведение. Стоят замедления в 2–3 раза и окупаются в первый же день. - Предупреждения.
-Wall -Wextra– минимум, с которого начинают. Многие ошибки из этого курса компилятор находит сам, если его попросить. - valgrind – если санитайзеры недоступны. Медленнее, но не требует пересборки.
- clang-format и clang-tidy – единый стиль и статический анализ. Второй ловит вещи,
до которых компилятор не добирается: пропущенный
override, лишнюю копию,nullptr, который точно разыменуется.
Видео и доклады
- CppCon – записи докладов на youtube.com/@CppCon. Начать стоит с Херба Саттера «Back to the Basics! Essentials of Modern C++ Style» и Скотта Мейерса «The Most Important Design Guideline».
- Бьярне Страуструп, «The Design and Evolution of C++» – книга, а не доклад, но объясняет, почему язык такой: почти каждая странность имеет причину, и обычно это совместимость с C.
Что делать после курса
Полезнее всего – взять существующий код и посмотреть, как в нём решены разобранные задачи.
Хорошие кандидаты для чтения: fmt, nlohmann/json, части abseil. Читать реализацию
std::vector из поставки компилятора не стоит: она написана для соответствия стандарту, а не
для чтения, и полна служебных имён с подчёркиваниями.
Не пытайтесь освоить весь C++. Это не одна цель, а список из десятков возможностей, которые применяются в разных задачах. Возьмите одно – семантику перемещения, исключения, многопоточность – и доведите до рабочего кода, прежде чем браться за следующее.