Программирование на языке C++. Продвинутый поток 2026

Материал из Public ATP Wiki
Перейти к навигации Перейти к поиску

О курсе

Курс посвящён изучению основных возможностей языка C++, особенностей управления памятью, объектно-ориентированного программирования, наследования и полиморфизма, стадий компиляции, шаблонов, исключений и устройства стандартных контейнеров.

Команда курса

Руководитель, лектор и семинарист: Мещерин Илья
Семинарист (некоторые занятия): Долта Артём
Ассистенты:

  • Краснов Илья Витальевич
  • Трофимов Михаил Алексеевич

Программа курса

Форма контроля в осеннем семестре: дифференцированный зачет

Неделя Лекция/ Семинар
1 Основные термины языка C++. Объекты, значения, переменные, типы. Объявления и определения, области видимости. Основные типы и операции над ними. Выражения и операторы. Приоритет операторов и порядок вычислений. Виды ошибок: ошибки компиляции (CE), ошибки времени выполнения (RE). Понятие неопределенного поведения (UB).
2 Указатели. Взятие адреса и разыменование. Арифметика указателей. Функции. Пергрузка функций. Указатели на функции. Массивы. Сходства и различия между массивами и указателями. Передача массивов в функции. Динамическая память, функции malloc/free, операторы new/delete. Статическая память и стек. Проблемы утечек памяти.
3 Ссылки. Особенности инициализации ссылок. Возврат ссылок из функций. Проблема висячих ссылок. Константы. Константные указатели и указатели на константу. Константные ссылки. Способы передачи аргументов в функцию. Способы приведения типов: static_cast, reinterpret_cast, const_cast.
4 Структуры и классы. Члены классов. Модификаторы доступа. Перегрузка операторов. Конструкторы и деструкторы. Операторы присваивания. Правило трех. Списки инициализации в конструкторах. Идиома copy-and-swap. Статические члены классов. Внутренние классы и локальные классы. Константные методы. Указатели на поля и методы.
5 Наследование. Публичное и приватное наследование. Видимость и доступность членов класса при наследовании. Использование using. Размещение объектов в памяти при наследовании. Приведения типов при наследовании. Принцип подстановки Лисков. Множественное наследование. Diamond problem. Виртуальное наследование.
6 Полиморфизм. Виртуальные функции. Ключевое слово override. Чисто виртуальные функции. Таблицы виртуальных функций. Внутреннее устройство vtable. Понятие ABI. Внутреннее устройство указателей на члены класса. Проблема виртуальных функций в конструкторах. Ошибка pure vitrual method call.
7 Стадии компиляции. Препроцессинг. Ассемблирование. Линковка, единицы трансляции. Ключевое слово extern. Правило одного определения и ключевое слово inline. Оптимизации компилятора. Примеры нетривиального UB из-за оптимизаций. Санитайзеры.
8 Шаблоны классов, функций, типов, переменных. Перегрузка шаблонных функций. Частичная и полная специализация шаблонов. Особенности определения шаблонных функций. Числовые параметры шаблонов. Простейшие compile-time вычисления. Шаблонные параметры шаблонов. Простейшие метафункции и их реализация. Зависимые имена. Шаблоны с переменным числом аргументов. Выражения свертки.
9 Исключения. Отличие исключений от RE. Особенности перехвата исключений. Проблема исключений в конструкторах и деструкторах. Идиома RAII и умные указатели. Множественные исключения, функция uncaught_exceptions. Иерархия стандартных исключений. Внутреннее устройство механизма обработки исключений.
10 Устройство стандартных контейнеров: vector, list, deque, map, unordered_map. Особенности vector<bool>. Реализация методов push_back и reserve для vector. Конструкция placement new. Итераторы. Инвалидация итераторов. Константные и неконстантные итераторы. Обратные итераторы. Категории итераторов.

Коммуникация

Ссылка на чат курса в мессенджере (ближе к старту семестра)

Прогресс студентов

Ссылка на таблицу студентов с оценками (ближе к старту семестра)