Course program← Программирование на языке C++
1Введение в язык C++
2Как выполняются программы на C++
3Структуры и классы
4Объектно-ориентированное программирование
5Дополнительные возможности C++
6Шаблоны
7Методические материалы

Книги, статьи и справочники

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++. Это не одна цель, а список из десятков возможностей, которые применяются в разных задачах. Возьмите одно – семантику перемещения, исключения, многопоточность – и доведите до рабочего кода, прежде чем браться за следующее.