• A
  • A
  • A
  • АБB
  • АБB
  • АБB
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта
Магистратура 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

Авторы

  • Нефедов Сергей Игоревич
  • Петряйкин Федор Алексеевич