• A
  • A
  • A
  • ABC
  • ABC
  • ABC
  • А
  • А
  • А
  • А
  • А
Regular version of the site

Programming in C/С++

2020/2021
Academic Year
RUS
Instruction in Russian
10
ECTS credits
Delivered at:
Joint Department with 1C
Course type:
Compulsory course
When:
1 year, 1-4 module

Instructors


Воробьев Даниил Владимирович


Крахмалёв Денис Сергеевич

Программа дисциплины

Аннотация

Данный курс является базовым при подготовке специалистов по направлению «Программная инженерия». Рассматривается базовый синтаксис, основные механики и возможности языка программирования С++, с глубоким погружением в детали реализации и работы. Большое внимание уделяется современным возможностям и стандартам языка. Также большую роль в курсе влияет значительное количество домашних заданий, для которых предусмотрена автоматическое тестирование и ручная проверка кода. Курс читается в 1-4 модулях.
Цель освоения дисциплины

Цель освоения дисциплины

  • Знать базовый синтаксис языка С++
  • Знать механизмы и объекты стандартной библиотеки С++
  • Уметь разрабатывать программы на языке С++
Содержание учебной дисциплины

Содержание учебной дисциплины

  • Знакомство
    Авторы языка C, C++. Даты выхода стандартов, периодичность выхода. Основные конференции
  • Структура программы
    Область видимости: Potential Scope, Actual Scope Ошибки компиляции: лексические, синтаксические, семантические Ошибки времени выполнения
  • Объявления
    Определение идентификатора. Пример корректного и некорректного идентификатора. Определение переменной. Пример переменной. Фундаментальные типы: char, int, float, double, bool, wchar_t, void Модели данных: LP32, ILP32, LLP64, LP64 Спецификаторы типов: short, signed, unsigned, long, long long Типы фиксированного размера: int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t Неявные преобразования типов: Promotion: Integral promotion, Float-point promotion Conversion: Integral conversion, Float-point conversion Константы: указатель на константные данные, константный указатель, константный указатель на константные данные Определение единицы трансляции One definition rule
  • Операторы
    Операторы: Precedence, Associativity Арифметические операторы: правоассоциативные, левоассоциативные Инкремент / Декримент. Отличие постфиксного от префиксного. Оператор присваивания Логические операторы Операторы сравнения Операторы доступа Другие: тернарный, запятая Специальные: sizeof, alignof, static_cast, С-style cast Выравнивание полей структуры Категории выражений до C++11: lvalue , rvalue Перегрузка функций Аргументы по умолчанию
  • Управляющие конструкции
    Управляющие конструкции: if, else if, else, for, while, do-while, switch, break, continue, return
  • Указатели
    Объявление: на объект, на тип void, на функцию, на поля и методы структуры Примеры использования Связь с C-массивов (C-array) Операции с указателями Операторы new, delete, delete[], new[] Утечка памяти и двойное удаление Передача по значению и по указателю
  • Ссылки
    Объявление Примеры использования Различия между ссылками и указателями Висячая ссылка (dangling reference) Передача по значению и по ссылке
  • Принципы ООП
    Принципы ООП: инкапсуляция, наследование, полиморфизм Инкапсуляция: пользовательские типы class и struct, спецификаторы доступа public, protected, private
  • Конструкторы и деструктор
    Конструктор по умолчанию (default constructor) Конструктор копирования (copy constructor) Ключевые слова default, delete Перегрузка конструкторов Сокрытие имен (Name hiding) Ключевое слово this Списки инициализации Ключевое слово explicit Деструктор Rule of three
  • Методы
    Константные методы Ключевое слово mutable Статические переменные Статические поля Статические методы
  • Перегрузка операторов
    Ключевое слово friend Перегрузка операторов: бинарные:(+. -, *, / ), сравнения унарные, ++, --, оператора приведения типа Определение функтора Определение компаратора Ограничения на перегрузку операторов: 1) :: ; . ; .*; ?: - не перегружаются 2) Precedence и Arity оператора не изменяются
  • Наследование и полиморфизм
    Наследование Объявление наследования Передача по ссылке на Base Спецификатор доступа по умолчанию при наследовании для struct / class Взаимоотношение спецификаторов при наследовании Сокрытие имен (Name hiding): 1) использование :: для обращения к имени 2) использование using для обращения к имени Порядок вызова конструкторов и деструкторов при наследовании Множественное наследование Diamond problem: 1) разрешения неоднозначности с :: 2) разрешение неоднозначности с помощью виртуального наследования Полиморфизм Определение полиморфного класса Указание virtual в производных классах Порядок вызова виртуальных функций Указатель на базовый класс Виртуальные функции и аргументы по умолчанию Таблица виртуальных функций Чисто виртуальная функция, абстрактный класс Виртуальный деструктор Идентификатор со специальным значением override Операторы приведения типов в применении к наследованию: static_cast, reinterpret_cast, dynamic_cast Паттерны проектирования Поведенческие: Команда, Наблюдатель, Посредник, Итератор, Состояние, Посетитель Порождающие: Строитель, Абстрактная фабрика, Прототип, Синглтон Структурные: Легковес, Компоновщик, Фасад, Декоратор, Прокси
  • Шаблоны
    Шаблонный класс и шаблонная функция Параметры шаблонов: type template parameter, non-type template parameter, template template parameter Указание параметров по умолчанию Определение инстанциации шаблона Специализации шаблонов: полная, частичная Единообразность parameter list у функций Отсутствие частичной специализации у функций Определение статического полиморфизма. Перегрузка функций и шаблоны Curiously Recurring Template Pattern (CRTP) Шаблонный алиас Использование typename для разрешения коллизий при доступе к полю Реализация type_traits с помощью шаблонных структур и typedef’ов: remove_const, remove_reference. Правила вывода типов для шаблонов Упорядочивание кандидатов при перегрузке Пакет параметров (template parameter pack) Вариативный шаблон (variadic template) Выделение в списке аргументов Head параметра и Tail пакета параметров для итерирования по списку аргументов Реализация std::less, std::greater Список типов и операции над ним: вычисление длины,обращение по индексу,поиск типа, добавление в конец,удаление первого вхождения заданного типа,удаление всех вхождений заданного типа Техники и вспомогательные инструменты: static_assert до C++11 на макросах, локальные классы, отображение целых чисел в типы, отображение типа в тип, выбор типа, проверка приводимости типа на этапе компиляции, type_traits: is_ptr, is_fundamental Реализация контейнеров: std::array, std::map
  • Исключения
    Оператор throw и конструкция try...catch. Примеры стандартных операторов, генерирующих исключения. Разница между исключениями и ошибкой времени выполнения Ошибки, не являющиеся исключениями Ловля всех исключений Пример оператора, генерирующего исключение -> Генерация ис Повторное пробрасывание исключения Отсутствие приведения типов для встроенных типов Приведение типов при наследовании Правило объявления исключений от частного к общему Перехват исключений по ссылке Перехват исключений по значению Спецификация исключений до C++11: список исключений throw std::unexpected, std::unexpected_handler, std::terminate Спецификация исключений после C++11: спецификатор и оператор noexcept Свойства спецификатора noexcept Применение оператора noexcept Исключения в конструкторах Проблема утечки памяти при исключениях. Разрешение проблемы посредством помещения ресурсов во временный объект Исключения в деструкторах. std::uncaught_exception Гарантии безопасности при исключениях: no guarantee, basic guarantee, strong guarantee, no throw guarantee
  • Итераторы
    Категории итераторов: LegacyInputIterator, LegacyOutputIterator, LegacyForwardIterator, LegacyBidirectionalIterator, LegacyRandomAccessIterator Обратный итератор Константый итератор Функция std::copy
  • Move семантика
    Мотивировка move семантики Мотивировка введения в язык rvalue reference Реализация std::move Различные реализации move конструктора Различные реализации move оператора присваивания, std::exchange Rule of five Rule of zero Дизъюнктивное разбиение выражений в xvalue, prvalue, lvalue Дизъюнктивное разбиение rvalue выражений в xvalue, prvalue Принадлежность идентификатора к lvalue Принадлежность function call expression к xvalue, prvalue, lvalue в зависимости от возвращаемого типа Добавление noexcept спецификатора к move оператору присваивания и замер производительности Коллапсирование ссылок Мотивировка введения в язык universal reference Реализация make_unique Реализация std::forward Подводные камни с std::forward и std::move Подвязка (binding) ссылок к выражениям Порядок отбора перегрузок Реализация std::unordered_map Реализация std::optional Реализация std::variant
  • Аллокаторы
    Различия в аллокаторах до и после C++11 Требования к методам: allocate, deallocate, max_size, construct, destroy Требования к выражениям взаимоотношения между экземплярами аллокатора (Relationship between instances) Метод select_on_container_copy_construction Алиасы: propagate_on_container_copy_assignment , propagate_on_container_move_assignment, propagate_on_container_swap Применение std::allocator_traits Применение rebind Реализация std::allocator с std::list
  • Умные указатели
    Мотивировка введения std::unique_ptr, std::shared_ptr, std::weak_ptr и объявление std::auto_ptr как deprecated Отсутствие у std::unique_ptr конструктора копирования Наличие у std::unique_ptr частичной специализации для массивов Шаблонный параметр Deleter Реализация подсчета ссылок внутри класса. Вынесение подсчета ссылок в ControlBlock Состав ControlBlock. Атомарность счетчика ссылок и реализация в LLVM Реализация std::make_shared Назначение std::weak_ptr Назначение метода lock в std::weak_ptr Замер производительности при конструировании std::unique_ptr, с raw_ptr и std::make_unique Замер производительности при конструировании std::shared_ptr, с raw_ptr и std::make_shared Семантика аргумента функции, когда он: экземпляр класса raw_ptr ссылка std::unique_ptr Std::shared_ptr Реализация std::shared_ptr, std::weak_ptr как в LLVM
  • Лямбда-функции
    Эквивалентность лямбды перегрузке operator() Различия в захвате по [&], [=] ,[&t=...], [t =...] Значение this в лямбдах Передача лямбды внутри одной единицы трансляции Передача лямбды между разными единицами трансляции Обобщенные лямбды (generic lambdas). Переменное число аргументов (variadic arguments) в лямбдах Реализация tuple и length std::forward в лямбдах до C++20 Список шаблонных параметров в лямбдах std::forward и лямбдах после C++20 Ключевое слово static в лямбдах. Изменение внутреннего состояния внутри лямбды с mutable Зависимость возможности копирования лямбды от возможности копирования захваченных данных
  • SFINAE
    Определение термина SFINAE Завязка срабатывания SFINAE на well-formed / ill-formed выражения Мотивировка использования SFINAE на примере std::add_lvalue_reference std::void_t как инструмент для реализации type_traits Разлчиие в конструкциях decltype(x) и decltype((x)) Примеры комбинаций decltype и declval для провоцирования SFINAE Реализация is_static_castable Реализация std::is_assignable Реализация std::is_polymorphic Реализация std::enable_if Реализация std::conditional Реализация std::is_copy_constructible как в LLVM Реализация std::is_nothrow_constructible как в LLVM Реализация std::move_if_noexcept как в LLVM Применение SFINAE: условный explicit конструктор для offset_ptr, улучшение сообщения об ошибки на примере pointer_to в pointer_traits
  • сonstexpr
    У constexpr функции parameter type и return type должны быть literal type Невозможность указания constexpr для виртуальных методов до C++20 Тело constexpr функции до и после C++14 Необходимость инициализации non-static членов Возможность использования constexpr переменных и constexpr функций в точках использования константных выражений (constant expressions) Отсутствие гарантии вычисления выражения в compile time при указании constexpr
  • Концепты
    Мотивировка введения концептов на примере поиска минимального элемента (std::min_element) и отсутствия информативной ошибки при попытке создания вектора ссылок Синтаксис концептов Извлечение ограничений / требований из алгоритма std::min_element для построения концептов Сущности, на которые можно наложить концепты: класс шаблонная переменная (variable template) шаблонный алиас шаблонные поля (template members) шаблонная функция Реализация концетов: ObjectType, std::floating_point, std::copyable
  • Многопоточное программирование I
    Причина введения потоков в стандарт Создание потока с std::thread. Передача в поток функции на исполнение Методы join и detach Определение терминов race condition и data race Определение термина критическая секция std::mutex методы lock и unlock RAII: std::lock_guard, std::unique_lock Структуры std::defer_lock_t, std::adopt_lock_t, std::try_lock_t Определение термина deadlock Захват нескольких мьютексов std::lock и std::scoped_lock Задача о философах std::conditional_variable методы: wait, wait_for, wait_for, wait_until, notify_one, notify_all Реализация класса TokenPool Гарантия thread-safe инициализации static переменных в C++11 Использование std::call_once, std::once_flag для гарантирования ровно одного thread-safe присваивания значения полю класса и последующих thread-safe обращений к этому полю на примере класса Logger Реализация std::shared_mutex (R/W lock) std::counting_semaphore, std::binary_semaphore Реализация std::counting_semaphore Барьеры (C++20) : одноразовый std::latch, многоразовый std::barrier
  • Многопоточное программирование II
    Определение гарантии lock-free std::atomic методы, load, store, fetch_add, fetch_sub, ++, -- Различие между compare_exchange_weak, compare_exchange_strong Реализация Append для односвязного списка Проблема ABA Реализация lock-free stack
Элементы контроля

Элементы контроля

  • неблокирующий Промежуточный экзамен (устный) в первом модуле
  • неблокирующий Промежуточный экзамен (устный) во втором модуле
  • неблокирующий Итоговый экзамен (устный) в четвертом модуле
  • неблокирующий практические задания первого модуля
  • неблокирующий практические задания второго модуля
  • неблокирующий практические задания третьего и четвертого модулей
  • неблокирующий Итог
Промежуточная аттестация

Промежуточная аттестация

  • Промежуточная аттестация (1 модуль)
    0.6 * практические задания первого модуля + 0.4 * Промежуточный экзамен (устный) в первом модуле
  • Промежуточная аттестация (2 модуль)
    0.6 * практические задания второго модуля + 0.4 * Промежуточный экзамен (устный) во втором модуле
  • Промежуточная аттестация (4 модуль)
    0.4 * Итоговый экзамен (устный) в четвертом модуле + 0.6 * практические задания третьего и четвертого модулей
Список литературы

Список литературы

Рекомендуемая основная литература

  • Мейерс С. - Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов - Издательство "ДМК Пресс" - 2007 - 294с. - ISBN: 5-94074-033-2 - Текст электронный // ЭБС ЛАНЬ - URL: https://e.lanbook.com/book/1224
  • Мэйерс С. - Эффективное использование C++. 55 верных способов улучшить структуру и код ваших прграмм - Издательство "ДМК Пресс" - 2008 - 300с. - ISBN: 5-94074-304-8 - Текст электронный // ЭБС ЛАНЬ - URL: https://e.lanbook.com/book/1245
  • О’Двайр А. - Осваиваем C++17 STL - Издательство "ДМК Пресс" - 2018 - 352с. - ISBN: 978-5-97060-663-6 - Текст электронный // ЭБС ЛАНЬ - URL: https://e.lanbook.com/book/116126

Рекомендуемая дополнительная литература

  • Herlihy, M., & Shavit, N. (2012). The Art of Multiprocessor Programming, Revised Reprint. Burlington: Morgan Kaufmann. Retrieved from http://search.ebscohost.com/login.aspx?direct=true&site=eds-live&db=edsebk&AN=460894