Программирование на С++ основной и продвинутый потоки — различия между версиями

Материал из Public ATP Wiki
Перейти к: навигация, поиск
(План курса)
(План курса)
 
(не показаны 2 промежуточные версии этого же участника)
Строка 81: Строка 81:
 
|-
 
|-
 
|10|| Перечисления (енумы)
 
|10|| Перечисления (енумы)
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Наследование
 +
|-
 +
 +
|1|| Приватное, публичное и защищенное наследование
 +
|-
 +
|2|| Видимость и доступность членов класса при наследовании
 +
|-
 +
|3|| Размещение объектов в памяти и порядок вызова конструкторов при наследовании
 +
|-
 +
|4|| Приведения типов при наследовании
 +
|-
 +
|5|| Множественное наследование
 +
|-
 +
|6|| Виртуальное наследование
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Шаблоны
 +
|-
 +
 +
|1|| Идея шаблонов и простые примеры
 +
|-
 +
|2|| Перегрузка шаблонных функций
 +
|-
 +
|3|| Специализации шаблонов
 +
|-
 +
|4|| Нетиповые параметры шаблонов
 +
|-
 +
|5|| Простейшие compile-time вычисления
 +
|-
 +
|6|| Зависимые имена
 +
|-
 +
|7|| Простейшие метафункции и type_traits
 +
|-
 +
|8|| Шаблоны с переменным количеством аргументов (variadic templates)
 +
|}
 +
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Полиморфизм и виртуальные функции
 +
|-
 +
|1|| Идея полиморфизма и виртуальных функций
 +
|-
 +
|2|| Более сложные примеры с виртуальными функциями
 +
|-
 +
|3|| Абстрактные классы и чисто виртуальные функции
 +
|-
 +
|4|| Виртуальный деструктор
 +
|-
 +
|5|| RTTI и dynamic_cast
 +
|-
 +
|6|| Реализация механизма виртуальных функций
 +
|-
 +
|7|| Виртуальные функции при множественном наследовании
 +
|-
 +
|8|| Некоторые нюансы, связанные с виртуальными функциями
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Исключения
 +
|-
 +
|1|| Идея и базовые примеры использования исключений
 +
|-
 +
|2|| Разница между RE и исключениями
 +
|-
 +
|3|| Более подробно о механизме бросания и ловли исключений
 +
|-
 +
|4|| Идиома RAII, исключения в конструкторах и деструкторах
 +
|-
 +
|5|| Безопасность относительно исключений, спецификации исключений
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Контейнеры и итераторы
 +
|-
 +
|1|| Понятие контейнера, обзор контейнеров
 +
|-
 +
|2|| Понятие итератора, виды итераторов
 +
|-
 +
|3|| Реализация и правильное использование итераторов
 +
|-
 +
|4|| Output-итераторы и итераторы над потоками
 +
|-
 +
|5|| Внутреннее устройство std::vector
 +
|-
 +
|6|| Внутреннее устройство std::deque
 +
|-
 +
|7|| Внутреннее устройство std::list
 +
|-
 +
|8|| Внутреннее устройство std::map
 +
|-
 +
|9|| Внутреннее устройство std::unordered_map
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Аллокаторы и управление памятью
 +
|-
 +
|1|| Идея и базовое применение аллокаторов
 +
|-
 +
|2|| Примеры нестандартных аллокаторов, понятие allocator-awareness
 +
|-
 +
|3|| Структура allocator_traits
 +
|-
 +
|4|| Перегрузка операторов new и delete
 +
|-
 +
|5|| Выравнивания и битовые поля
 +
|-
 +
|6|| Scoped-аллокаторы
 +
|-
 +
|7|| Полиморфные аллокаторы
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! 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
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Вывод типов
 +
|-
 +
|1|| Ключевое слово auto
 +
|-
 +
|2|| Ключевое слово decltype и конструкция decltype(auto)
 +
|-
 +
|3|| Class template argument deduction (CTAD)
 +
|-
 +
|4|| Structured bindings
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Умные указатели
 +
|-
 +
|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
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Лямбда-функции
 +
|-
 +
|1|| Идея и базовое использование лямбда-функций
 +
|-
 +
|2|| Списки захвата в лямбда-функциях
 +
|-
 +
|3|| Лямбда-функции как функциональные объекты
 +
|-
 +
|4|| Класс std::function
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Стирание типов, юнионы
 +
|-
 +
|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
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Шаблонное метапрограммирование, SFINAE и концепты
 +
|-
 +
|1|| Основные примитивы шаблонного метапрограммирования
 +
|-
 +
|2|| Идиома SFINAE и структура std::enable_if
 +
|-
 +
|3|| Метафункции для проверки наличия методов в классе
 +
|-
 +
|4|| Реализация move_if_noexcept
 +
|-
 +
|5|| Реализация is_base_of
 +
|-
 +
|6|| Реализация common_type
 +
|-
 +
|7|| Ограничения, ключевое слово requires
 +
|-
 +
|8|| Концепты
 +
|}
 +
{|  class="wikitable"
 +
|-
 +
! №
 +
! Compile-time вычисления
 +
|-
 +
|1|| Constexpr-функции и переменные
 +
|-
 +
|2|| Новые возможности constexpr в C++20
 +
|-
 +
|3|| Consteval и constinit
 +
|-
 +
|4|| Метаконтейнер typelist
 +
|-
 +
|5|| Реализация qiucksort для метаконтейнера
 
|}
 
|}
  

Текущая версия на 18:06, 4 декабря 2022

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

  • Семестр: 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 балл

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

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