Магистратура
2025/2026





Программирование на C++
Статус:
Курс обязательный (Аппаратно-программные комплексы искусственного интеллекта)
Кто читает:
Департамент электронной инженерии
Когда читается:
2-й курс, 1, 2 модуль
Охват аудитории:
для своего кампуса
Язык:
русский
Кредиты:
6
Контактные часы:
60
Программа дисциплины
Аннотация
Данный курс посвящен метапрограммированию, boost, C++20, невытесняющей многозадачности. В данной части особое внимание удаляется техникам промышленного программирования: проекты в ней должны быть реализованы как полноценные компоненты, с документацией, автотестами и другими аттрибутами “хорошего кода”.
Цель освоения дисциплины
- Дать студентам глубокие знания и практические навыки в области программирования на языке C++. Курс направлен на изучение фундаментальных концепций и технологий языка C++, которые являются базовыми для многих современных языков программирования и широко используются в различных областях разработки программного обеспечения.
Планируемые результаты обучения
- Знать причины использования пространств имен, правила разрешения вложенных пространств имен, синтаксис ключевого слова USING, принцип ADL
- Знать определение владения
- Знать виды умных указателей STL, их внутреннее устройство
- Знать определение функтора, синтаксис лямбда-функций (в т.ч. явное указание типа возврата, различные способы захвата переменных)
- Знать внутреннее устройство лямбда-функций
- Уметь использовать анонимные пространства имен для ограничения связывания символа, вводить определенные символы или все символы из пространства имен в текущую область видимости
- Уметь отличать ситуации владения и использования, грамотно выражать отношения в синтаксисе умных указателей
- Знать определение итератора, иерархию итераторов
- Знать преимущества и недостатки подхода реализации алгоритмов через итераторы. - базовые контейнеры STL: VECTOR, LIST, MAP, UNOREDERED_MAP, адаптивные контейнеры: STACK, QUEUE
- Знать основные алгоритмы из STL
- Уметь написать объявление класса-итератора. - решать задачи с использованием итераторов и алгоритмов
- Уметь использовать лямбда-функции в качестве предикатов
- Знать преимущество и недостатки библиотеки STD::RANGES перед стандартными алгоритмами, методы библиотек STD::FILESYSTEM, STD::REGEX. -определение кодировок, устройство однобайтовых кодировок, кодировок фиксированной длины (UTF-16), кодировок переменной длины (UTF-8)
- Уметь использовать ICU для работы с текстами с символами вне ASCII
- Знать причины использования наследования, виды наследования в C++ и логические отношения, которые они выражают
- Знать расположение данных класса-наследника и базового класса в памяти
- Знать порядок инициализации и уничтожения данных при наследовании, способ инициализации базового класса. Protected-данные
- Уметь спроектировать простую систему из классов, связанных отношением наследования
- Знать определение полиморфизма, понятие "позднего связвания"
- Знать синтаксис ключевых слов virtual и override
- Знать принцип работы виртуальных функций. - возможные проблемы с производительностью и памятью при использовании динамического полиморфизма
- Знать принципы одновременного использования виртуальных функций и шаблонов
- Знать определение чистых виртуальных функций и интерфейсов
- Знать принцип работы dynamic_cast
- Уметь проектировать и реализовывать иерархию полиморфных классов
- Знать проблемы, возникающие при множественном наследовании, принцип работы виртуальных базовых классов и полиморфизма при множественном наследовании, внутреннее устройство таблиц виртуальных функций
- Знать содержимое type_info, принцип его работы
- Знать синтаксис генерации и ловли исключений
- Знать иерархию встроенных исключений
- Уметь по представленной иерархии классов определить порядок инициализации данных, предоставлять гарантии безопасности кода с помощью исключений и raii, реализовывать классы исключений, связывать их в верную архитектуру
- Знать определение универсальных ссылок, причины их использования
- Знать принцип perfect forwarding - причины использования и ситуации применения
- Знать отличия std::move от std::forward. - синтаксис шаблонов с переменным числом аргументов, шаблон-шаблонных параметров
- Знать отличие elipsis-а в параметрах от переменного числа аргументов
- Уметь реализовывать собственные аналоги std::move и std::forward. - реализовывать классы/функции, использующие переменное число шаблонных аргументов
- Знать принцип SIFNAE и причины его применения, стандартные классы STL для выполнения SFINAE-операций (определения свойств типа)
- Знать синтаксис концептов
- Уметь реализовывать самостоятельно простейшие SFINAE-конструкции, разбирать ошибки при компиляции шаблонного кода
- Уметь накладывать ограничения на шаблонные типы с помощью SFINAE и концептов
- Знать принцип устройства STD::VARIANT, STD::TUPLE, STD::ANY, STD::FUNCTION, знать ситуации их применимости
- Уметь реализовывать собственные аналоги гетерогенных контейнеров
- Уметь реализовывать алгоритмы с VARIANT с помощью FOLD EXPRESSION
- Уметь использовать библиотеки BOOST::FUSION И BOOST::MP для автоматизации работы с данными
Содержание учебной дисциплины
- Контроль остаточных знаний. Пространства имен, USING. STL - функторы, умные указатели
- STL - итераторы. Контейнеры. Алгоритмы
- STD::RANGES. Аллокаторы. FILESYSTEM. Регулярные выражения. Кодировки, ICU
- Повторное использование кода - наследование
- Полиморфизм. Виртуальные функции. Чистые виртуальные функции и интерфейсы. Rtti (dynamic_cast)
- Множественное наследование. Rtti (type_info). Исключения
- Универсальные ссылки, PERFECT FORWARDING. Шаблоны с переменным числом аргументов
- SFINAE. Концепты
- Гетерогенные контейнеры (VARIANT, TUPLE), удаление типов
- Семинар: реализация рефлексии на C++. знакомство с BOOST::MP
Элементы контроля
- Экзамен
- Практические задания
- Входное тестирование
- Домашние задания
- Рубежный контроль 1
- Рубежный контроль 2
- Экзамен
- Практические задания
- Домашние задания
Промежуточная аттестация
- 2024/2025 4th moduleИтоговая оценка формируется как сумма оценок за отдельные элементы контроля. Баллы, полученные за практические задания на семинарах, суммируются с баллами, полученными за экзамен (и в сумме могут быть не более 30), но при этом для получения зачёта необходимо сдать экзамен минимум на 15 баллов. Формула расчета итоговой оценки: SUM_7_ДОМАШНИЙ ЗАДАНИЙ + (SUM_14_ПРАКТИЧЕСКИХ ЗАДАНИЙ НА СЕМИНАРЕ + ЭКЗАМЕН) ГДЕ (SUM_14_ПРАКТИЧЕСКИХ ЗАДАНИЙ НА СЕМИНАРЕ + ЭКЗАМЕН) ≤ 30 БАЛЛОВ
- 2025/2026 2nd moduleИтоговая оценка формируется как сумма оценок за отдельные элементы контроля. Баллы, полученные за практические задания на семинарах, суммируются с баллами, полученными за рубежные контроли (и в сумме могут быть не более 20 баллов за оба рубежных контроля). Формула расчета итоговой оценки: 0,6 * AVG_4_ДОМАШНИЙ ЗАДАНИЙ + 0,2 * (AVG_10_ПРАКТИЧЕСКИХ ЗАДАНИЙ НА СЕМИНАРЕ + AVG_2_РУБЕЖНЫХ КОНТРОЛЯ) + 0,2 * ЭКЗАМЕН ГДЕ (AVG_10_ПРАКТИЧЕСКИХ ЗАДАНИЙ НА СЕМИНАРЕ + AVG_2_РУБЕЖНЫХ КОНТРОЛЯ) ≤ 10 БАЛЛОВ
Список литературы
Рекомендуемая основная литература
- Чистая архитектура : искусство разработки программного обеспечения, Мартин, Р., 2019
- Эффективный и современный С++ : 42 рекомендации по использованию С++11 и С++14: пер. с англ., Мейерс, С., 2019
- Язык программирования С++ : лекции и упражнения, Прата, С., 2012
Рекомендуемая дополнительная литература
- Чистый код : cоздание, анализ и рефакторинг, Мартин, Р., 2023