Бакалавриат
2026/2027




Программирование на C++ (углубленный курс)
ID 1182037
Статус:
Курс по выбору (Экономика и анализ данных)
Где читается:
Факультет компьютерных наук
Когда читается:
1-й курс, 1, 2 модуль
Охват аудитории:
для всех кампусов НИУ ВШЭ
Язык:
русский
Кредиты:
4
Контактные часы:
112
Программа дисциплины
Аннотация
Курс продолжает базовое программирование и посвящён тому, как C++ устроен внутри и как на нём пишут промышленный код. Мы разбираем полный путь программы от исходника до исполняемого файла (единицы трансляции, ODR, линковка, сборка через CMake), модель памяти и время жизни объектов, объектную модель (таблицы виртуальных функций, RTTI, множественное наследование), управление ресурсами через RAII и move-семантику, шаблоны — от базовых до concepts C++20, контейнеры и алгоритмы стандартной библиотеки, аллокаторы и влияние расположения данных в памяти на скорость, а также проектирование обработки ошибок и интерфейсов.
Практика построена вокруг одного сквозного индивидуального проекта: студент пишет консольный поисковый движок, который читает документы из нескольких форматов баз данных, токенизирует их и ранжирует результаты по запросу, а на продвинутом уровне строит и использует векторный индекс на библиотеке FAISS. Каждая лекция даёт инструмент, который на ближайших занятиях сразу уходит в проект. Дополнительно в течение семестра проводятся четыре контеста в тестирующей системе (быстрая проверка понимания языка) и четыре контрольных домашних задания расчётно-исследовательского типа, где нужно не просто написать код, а измерить и объяснить его поведение.
Цель освоения дисциплины
- Понимать модель трансляции и сборки C++-программы: единицы трансляции, ODR, статическая и динамическая линковка; уметь собирать многофайловый проект средствами CMake и подключать сторонние зависимости.
- Знать модель памяти C++: storage duration, linkage, время жизни объектов, выравнивание и padding; уметь объяснить разницу между стеком и кучей на уровне машинного представления
- Уметь пользоваться инструментами отладки и динамического анализа: gdb, valgrind, ASan/UBSan.
- Уметь проектировать классы с явно сформулированным инвариантом; знать устройство таблицы виртуальных функций и цену динамического полиморфизма.
- Знать правила разрешения перегрузки (overload resolution, ADL) и уметь корректно перегружать операторы, включая оператор <=> (C++20).
- Владеть идиомой RAII и move-семантикой: rule of zero/three/five, std::move, RVO и copy elision; уметь обоснованно выбирать между unique_ptr, shared_ptr и weak_ptr.
- Уметь писать шаблонный код: специализации, нетиповые параметры, variadic templates, perfect forwarding; уметь ограничивать шаблоны через SFINAE и через concepts (C++20).
- Знать устройство и асимптотику ассоциативных контейнеров, уметь обоснованно выбирать контейнер под задачу; уметь применять алгоритмы стандартной библиотеки и ranges C++20.
- Понимать работу аллокаторов и влияние расположения данных в памяти (cache locality, SoA vs AoS) на производительность; уметь ставить замеры и интерпретировать их результаты.
- Уметь проектировать обработку ошибок и контракты интерфейсов: коды возврата vs исключения, noexcept, assert, std::expected.
Планируемые результаты обучения
- Студент самостоятельно организует C++-проект с нуля: структура репозитория, сборка на CMake, разделение на библиотеку и исполняемый файл, подключение сторонних зависимостей (FetchContent / find_package).
- Читает и понимает современный C++-код (C++17/20), включая шаблонный, и умеет объяснить, что происходит на уровне памяти и вызовов.
- Диагностирует утечки, неопределённое поведение и падения с помощью gdb, valgrind и санитайзеров, умеет работать с core dump.
- Пишет классы, безопасные по владению ресурсами: без утечек, двойных освобождений и висячих ссылок.
- Обоснованно выбирает структуру данных и контейнер под задачу, аргументируя выбор асимптотикой и характером доступа к памяти.
- Умеет измерять производительность, сравнивать альтернативные реализации и делать выводы по замерам, а не по интуиции.
- Доводит до конца индивидуальный проект среднего размера и защищает принятые в нём технические решения
Содержание учебной дисциплины
- Компиляция и сборка C++
- Модель памяти C++
- Структуры и классы
- ООП, часть 1: наследование и виртуальные функции
- ООП, часть 2: полиморфизм, RTTI, множественное наследование
- Перегрузка функций и операторов
- RAII, move-семантика, rule of five, умные указатели
- Шаблоны, часть 1
- Шаблоны, часть 2: от функторов до concepts
- Ассоциативные контейнеры и хранение альтернативных типов
- Библиотека алгоритмов и STL
- Аллокаторы и хранение данных
Элементы контроля
- Контесты 1–4Четыре контеста в тестирующей системе, выдаются после лекций № 1, 3, 5 и 8. Каждый контест содержит 5 задач по материалу предыдущих лекций и семинаров (сборка и ODR, классы и инварианты, виртуальные функции и полиморфизм, шаблоны). Проверка автоматическая по скрытым тестам, окружение — Linux, gcc/clang, стандарт C++20. Срок сдачи — 10 дней с момента выдачи Бонусы: в каждом контесте доступна одна дополнительная задача повышенной сложности (+2 балла). Бонусные баллы могут быть добавлены к любому контесту или КДЗ, выполненному не на максимальный балл; оценка за отдельную форму контроля при этом не может превышать 10 баллов.
- Контрольные домашние задания 1-4Четыре контрольных домашних задания расчётно-исследовательского типа, выдаются после лекций № 2, 4, 7 и 9. КДЗ 1 — замер stack vs heap и эффект выравнивания на размер структур; КДЗ 2 — иерархия «читателей файлов» на виртуальных функциях; КДЗ 3 — бенчмарк copy vs move для контейнера документов; КДЗ 4 — логгер с perfect forwarding. Сдаётся код плюс краткий отчёт (методика замера, результаты, объяснение). КДЗ 2 и КДЗ 4 являются частями проекта и переиспользуются в нём. Срок сдачи — 2 недели.
- ПроектСквозной индивидуальный проект: консольный поисковый движок. Уровень 8/10 — CLI-приложение: чтение БД (SQL/Excel/Document), поиск по запросу, ранжирование, консольный вывод результата. Уровень 10/10 — то же плюс построение и использование FAISS-индекса, два режима работы: построение индекса из документа и поиск по готовому индексу. Промежуточная веха (уровень 8/10) сдаётся после лекции № 11, финальная версия — после лекции № 12. Защита проекта (блокирующая) Проводится на последнем занятии (после лекции № 14) в устной форме, очно или на платформе Zoom. Студент демонстрирует работающую программу, проводит короткое код-ревью своих ключевых решений и отвечает на вопросы по любому месту собственного кода и по материалу курса, который в этом коде задействован. Пользоваться собственным кодом и документацией разрешается, помощь третьих лиц запрещена.
Промежуточная аттестация
- 2026/2027 2nd module0.2 * Контесты 1–4 + 0.25 * Контрольные домашние задания 1-4 + 0.55 * Проект