Программирование на С++ основной и продвинутый потоки

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

Общие сведения

  • Семестр: 1 (первый курс курс)
  • Форма контроля: дифференцированный зачет

Важные ссылки

  • Регистрация на курс (доступ для физтех-аккаунтов)
  • Материалы курсa (доступ для физтех-аккаунтов)
  • Чат курса
  • Таблица с оценками

Требования

  • Физтех-почта (домен phystech.edu)
  • Аккаунт на GitHub
  • Ноутбук на занятиях

План курса

Введение
1 Общие слова и немного истории
2 Знакомство с компилятором, первая программа
3 Основные типы и операции над ними
4 Объявления, определения и области видимости
5 Выражения (expressions) и операторы
6 Управляющие инструкции (control statements)
7 Ошибки компиляции, ошибки времени выполнения и UB
Модификаторы типов
1 Указатели
2 Виды памяти
3 Массивы
4 Функции
5 Ссылки
6 Константы
7 Приведения типов
Основы ООП. Инкапсуляция
1 Классы и структуры
2 Модификаторы доступа, инкапсуляция
3 Конструкторы и деструкторы
4 Правило трех
5 Перегрузка операторов
6 Константные методы
7 Статические поля и методы
8 Пользовательские приведения типов
9 Указатели на члены
10 Перечисления (енумы)
Наследование
1 Приватное, публичное и защищенное наследование
2 Видимость и доступность членов класса при наследовании
3 Размещение объектов в памяти и порядок вызова конструкторов при наследовании
4 Приведения типов при наследовании
5 Множественное наследование
6 Виртуальное наследование
Шаблоны
1 Идея шаблонов и простые примеры
2 Перегрузка шаблонных функций
3 Специализации шаблонов
4 Нетиповые параметры шаблонов
5 Простейшие compile-time вычисления
6 Зависимые имена
7 Простейшие метафункции и type_traits
8 Шаблоны с переменным количеством аргументов (variadic templates)
Полиморфизм и виртуальные функции
1 Идея полиморфизма и виртуальных функций
2 Более сложные примеры с виртуальными функциями
3 Абстрактные классы и чисто виртуальные функции
4 Виртуальный деструктор
5 RTTI и dynamic_cast
6 Реализация механизма виртуальных функций
7 Виртуальные функции при множественном наследовании
8 Некоторые нюансы, связанные с виртуальными функциями
Исключения
1 Идея и базовые примеры использования исключений
2 Разница между RE и исключениями
3 Более подробно о механизме бросания и ловли исключений
4 Идиома RAII, исключения в конструкторах и деструкторах
5 Безопасность относительно исключений, спецификации исключений
Контейнеры и итераторы
1 Понятие контейнера, обзор контейнеров
2 Понятие итератора, виды итераторов
3 Реализация и правильное использование итераторов
4 Output-итераторы и итераторы над потоками
5 Внутреннее устройство std::vector
6 Внутреннее устройство std::deque
7 Внутреннее устройство std::list
8 Внутреннее устройство std::map
9 Внутреннее устройство std::unordered_map
Аллокаторы и управление памятью
1 Идея и базовое применение аллокаторов
2 Примеры нестандартных аллокаторов, понятие allocator-awareness
3 Структура allocator_traits
4 Перегрузка операторов new и delete
5 Выравнивания и битовые поля
6 Scoped-аллокаторы
7 Полиморфные аллокаторы
Move-семантика и rvalue-ссылки
1 Мотивировка move-семантики и волшебная функция std::move
2 Move-конструкторы и move-assignment операторы
3 Реализация функции std::move
4 Формальное определение lvalue и rvalue
5 Особенности rvalue-ссылок
6 Проблема perfect forwarding
7 Реализация функции std::forward
8 Expired values (xvalues), RVO и copy elision
9 Функция move_if_noexcept
Вывод типов
1 Ключевое слово auto
2 Ключевое слово decltype и конструкция decltype(auto)
3 Class template argument deduction (CTAD)
4 Structured bindings
Умные указатели
1 Класс std::unique_ptr
2 Класс std::shared_ptr
3 Функции make_unique и make_shared
4 Класс std::weak_ptr
5 Проблема нестандартного аллокатора и удалителя в shared_ptr
6 Структура enable_shared_from_this и паттерн CRTP
Лямбда-функции
1 Идея и базовое использование лямбда-функций
2 Списки захвата в лямбда-функциях
3 Лямбда-функции как функциональные объекты
4 Класс std::function
Стирание типов, юнионы
1 Идиома type erasure и класс std::any
2 Решение проблемы с нестандартным deleter’ом для shared_ptr
3 Юнионы
4 Small objects optimization и empty base optimization
5 Реализация std::function
6 Класс std::variant и его реализация
7 Функция std::launder
Шаблонное метапрограммирование, SFINAE и концепты
1 Основные примитивы шаблонного метапрограммирования
2 Идиома SFINAE и структура std::enable_if
3 Метафункции для проверки наличия методов в классе
4 Реализация move_if_noexcept
5 Реализация is_base_of
6 Реализация common_type
7 Ограничения, ключевое слово requires
8 Концепты
Compile-time вычисления
1 Constexpr-функции и переменные
2 Новые возможности constexpr в C++20
3 Consteval и constinit
4 Метаконтейнер typelist
5 Реализация qiucksort для метаконтейнера

Оценивание

Оценка по курсу состоит из нескольких частей:

  1. Тесты
  2. Контесты
  3. Практические проекты
  4. Лабораторная работа

Тесты

  • Небольшие тесты на 10 минут в начале каждого занятия
  • Вопросы по материалам прошлого занятия
  • Для прохождения нужен phystech.edu-аккаунт
  • За каждый тест - 10 баллов.

Контесты

  • Набор задач с автоматической проверкой тестирующей системой Я.Контест (нужен phystech.edu-аккаунт)
  • Всего 6 тестов - после каждой темы базового блока
  • Срок решения - 2 недели
  • За каждый контест - 10 баллов
  • Списывание детектируется и наказуемо!

Практические проекты

  • 2 проекта - консольное приложение (после ООП) и серверное приложение (после Сети-2)
  • Работа над кодом в несколько итераций на GitHub (нужен аккаунт)
  • Срок работы - 2 недели + 1 неделя на каждую следующую итерацию
  • Список тем проектов будет позднее
  • Оценка за проект: зачет / незачет + до 2 доп. баллов (wow-эффект)

Лабораторная работа

  • Анализ данных с помощью Pandas и Matplotlib
  • Выдается после “Инструменты визуализации”
  • Срок работы - 2 недели
  • Оценка - 10 баллов
  • Является блокирующей! Для получения зачета за курс необходимо набрать хотя бы 1 балл

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

  • Преподаватели:
    • Мещерин Иллья