Программирование на С++ основной и продвинутый потоки — различия между версиями
(Новая страница: «= Общие сведения = * Семестр: 1 (первый курс курс) * Форма контроля: дифференцированный заче…») |
(→План курса) |
||
(не показано 6 промежуточных версий этого же участника) | |||
Строка 19: | Строка 19: | ||
|- | |- | ||
! № | ! № | ||
− | ! | + | ! Введение |
|- | |- | ||
− | |1|| | + | |1|| Общие слова и немного истории |
+ | |- | ||
+ | |2|| Знакомство с компилятором, первая программа | ||
+ | |- | ||
+ | |3|| Основные типы и операции над ними | ||
+ | |- | ||
+ | |4|| Объявления, определения и области видимости | ||
+ | |- | ||
+ | |5|| Выражения (expressions) и операторы | ||
+ | |- | ||
+ | |6|| Управляющие инструкции (control statements) | ||
+ | |- | ||
+ | |7|| Ошибки компиляции, ошибки времени выполнения и UB | ||
+ | |} | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! № | ||
+ | ! Модификаторы типов | ||
+ | |- | ||
+ | |1|| Указатели | ||
+ | |- | ||
+ | |2|| Виды памяти | ||
+ | |- | ||
+ | |3|| Массивы | ||
+ | |- | ||
+ | |4|| Функции | ||
+ | |- | ||
+ | |5|| Ссылки | ||
+ | |- | ||
+ | |6|| Константы | ||
+ | |- | ||
+ | |7|| Приведения типов | ||
+ | |} | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! № | ||
+ | ! Основы ООП. Инкапсуляция | ||
|- | |- | ||
− | |2|| | + | |1|| Классы и структуры |
+ | |- | ||
+ | |2|| Модификаторы доступа, инкапсуляция | ||
+ | |- | ||
+ | |3|| Конструкторы и деструкторы | ||
+ | |- | ||
+ | |4|| Правило трех | ||
+ | |- | ||
+ | |5|| Перегрузка операторов | ||
+ | |- | ||
+ | |6|| Константные методы | ||
+ | |- | ||
+ | |7|| Статические поля и методы | ||
+ | |- | ||
+ | |8|| Пользовательские приведения типов | ||
+ | |- | ||
+ | |9|| Указатели на члены | ||
+ | |- | ||
+ | |10|| Перечисления (енумы) | ||
+ | |} | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! № | ||
+ | ! Наследование | ||
+ | |- | ||
+ | |1|| Приватное, публичное и защищенное наследование | ||
+ | |- | ||
+ | |2|| Видимость и доступность членов класса при наследовании | ||
+ | |- | ||
+ | |3|| Размещение объектов в памяти и порядок вызова конструкторов при наследовании | ||
+ | |- | ||
+ | |4|| Приведения типов при наследовании | ||
+ | |- | ||
+ | |5|| Множественное наследование | ||
+ | |- | ||
+ | |6|| Виртуальное наследование | ||
+ | |} | ||
+ | {| class="wikitable" | ||
+ | |- | ||
+ | ! № | ||
+ | ! Шаблоны | ||
|- | |- | ||
− | |3|| | + | |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 для метаконтейнера |
Оценивание
Оценка по курсу состоит из нескольких частей:
- Тесты
- Контесты
- Практические проекты
- Лабораторная работа
Тесты
- Небольшие тесты на 10 минут в начале каждого занятия
- Вопросы по материалам прошлого занятия
- Для прохождения нужен phystech.edu-аккаунт
- За каждый тест - 10 баллов.
Контесты
- Набор задач с автоматической проверкой тестирующей системой Я.Контест (нужен phystech.edu-аккаунт)
- Всего 6 тестов - после каждой темы базового блока
- Срок решения - 2 недели
- За каждый контест - 10 баллов
- Списывание детектируется и наказуемо!
Практические проекты
- 2 проекта - консольное приложение (после ООП) и серверное приложение (после Сети-2)
- Работа над кодом в несколько итераций на GitHub (нужен аккаунт)
- Срок работы - 2 недели + 1 неделя на каждую следующую итерацию
- Список тем проектов будет позднее
- Оценка за проект: зачет / незачет + до 2 доп. баллов (wow-эффект)
Лабораторная работа
- Анализ данных с помощью Pandas и Matplotlib
- Выдается после “Инструменты визуализации”
- Срок работы - 2 недели
- Оценка - 10 баллов
- Является блокирующей! Для получения зачета за курс необходимо набрать хотя бы 1 балл
Команда курса
- Преподаватели:
- Мещерин Иллья