DEV-C220. Прикладное программирование с использованием стандартов С++11, 14, 17, 20. Базовый уровень
Длительность дисциплины: 44 ак.ч.
Аннотация
Целью реализации программы повышения квалификации является освоение слушателями новых концепций и программных средств, добавленных в язык программирования С++ согласно стандарту С++11 (С++14 – С++17 – С++20)
Знания и умения, полученные в результате изучения
Умение
корректно и эффективно использовать новые встроенные средства языка С++.
Умение, предоставляемые новыми стандартами С++ как ядром языка, так и стандартной
библиотекой С++.
Использования семантики перемещения (move semantics).
Увеличение гибкости программ за счет использования шаблонов с переменным числом параметров (variadic templates).
Уменьшение количества дублируемого текста программы посредством семантики продвижения (forwarding).
Использование лямбда функции для поддержки локальных действий.
Содержание дисциплины
Тема 1. Введение
1.1 Обзор новых возможностей. языка С++ согласно стандарту С++11 (14, 17, 20)
Преемственность от библиотеки Boost.
Изменения в ядре языка.
Изменения в стандартной библиотеки
1.2 Назначение новых возможностей.
Повышение эффективности работы программы.
Предоставление программисту удобных средств для автоматического вывода типов компилятором.
Повышение надежности.
Тема 2. Нововведения в ядре языка.
2.1 Сильно типизированные перечисления.
Nullptr.
Новые фундаментальные типы.
Проблемы использования перечислений С/С++.
Добавление strongly typed enums.
Проблемы при использовании неинициализированных указателей.
Задание нулевых указателей.
Переменная nullptr.
Тип nullptr_t.
Независящие от платформы и компилятора псевдонимы для целых типов.
2.2 Новые стандартные суффиксы и префиксы для литералов.
Суффикс LL.
Префиксы 0b, u, U
2.3 Ключевое слово auto.
Декомпозиция.
Автоматическое выведение типов компилятором.
Задание обобщенных параметров.
Trailing return type.
Понятие structured binding.
Компактность и читабельность текста программы.
Использование с массивами, структурами и кортежами.
2.4 Цикл по коллекциям.
Range based for.
Использование с массивами и контейнерами стандартной библиотеки.
Практические занятия
1. Использование strongly typed enums для обеспечения надежности и экономии памяти
2. Использование auto для автоматического выведения типов
3. Применение декомпозиции
Тема 3. Новые правила и возможности инициализации.
3.1 Автоматический вывод параметров шаблона при инициализации.
Упрощение синтаксиса.
Возможность формирования «подсказок» для выведения типа компилятором (deduction guides)
3.2 Инициализация переменных класса при объявлении.
Задание значений переменных «по умолчанию».
Специфика.
Способы инициализации членов класса.
3.3 Универсальная инициализация.
Понятие обобщенной инициализации.
Исполь-зование обобщенной инициализации для инициализации объектов и коллекций.
Списки инициализации при динамическом выделении памяти.
Класс initializer_list
3.4 Спецификатор decltype
Правила выведения компилятором типа при использовании decltype.
Отличия auto и decltype.
Конструкция decltype(auto).
Спецификатор declval
Практические занятия
1. Обобщенная инициализация объектов и контейнеров
2. Реализация класса с использованием initializer_list при инициализации, присваивании и в других методах
3. Применение decltype при реализации шаблонов
Тема 4. Модификация контейнеров стандартной библиотеки. using
4.1 Дополнения функциональности контейнеров стандартной библиотеки.
Методы, использующие move-семантику, конструрование «по месту», списки инициализации
4.2 Дополнительные возможности using.
Задание псевдонимов типов посредством using.
Псевдонимы шаблона.
Практические занятия
1. Применение новых возможностей стандартных контейнеров при решении типовых задач.
2. Использование псевдонимов шаблонов для упрощения сложных объявлений
Тема 5. Лямбда выражения
5.1 Лямбда функции.
Синтаксис лямбда функции
Реализация локальных действий посредством лямбда функции.
Параметры, передаваемые лямбда функции.
Возвращаемое лямбда функцией значение
5.2 Специфика лямбда функции.
Захват значений из внешнего контекста.
Средства организации рекурсии посредством лямбда функции.
Обобщенные лямбда функции.
Практические занятия
1. Использование лямбда функций для решения локальных задач
2. Использование лямбда функций в качестве предикатов в обобщенных алгоритмах
Тема 6. Нововведения при объявлении классов.
6.1 Явное указание компилятору генерации методов класса по умолчанию.
Явная перегрузка виртуальных методов.
Явный запрет вызова метода.
Использование ключевого слова default для автоматической генерации компилятором метода класса.
Использование ключевого слова override для явного указания перегруженного виртуаль-ного метода класса.
Использование ключевого слова final для предотвращения перегрузки виртуального метода в производном классе.
Понятие deleted.
Использование ключевого слова delete для предотвращения вызова метода класса
6.2 Запрещение неявных преобразований.
Делегирующие конструкторы.
Наследуемые конструкторы.
Использование ключевого слова explicit для предотвращения неявных преобразований.
Понятия наследования и делегирования инициализирующих методов.
Синтаксис.
Практические занятия
1. Разработка иерархий классов с использованием default, override, final и deleted
2. Использование ключевого слова explicit
Тема 7. Семантика перемещения.
7.1 Rvalue reference.
Цель введения семантики перемещения
Использование правосторонних ссылок для обозначения временных объектов.
Использование семантики перемещения для повышения эффективности ПО.
7.2 Move конструкторы копирования, move операторы присваивания
Повышение эффективности программы посред-ством использования семантики перемещения для нетривиальных классов
7.3 Семантика перемещения и внедрение.
Семантика перемещения и наследование
Классы с нетривиальными внедренными объектами.
Иерархии классов с нетривиальным базовым классом
7.4 Ссылочные квалификаторы методов.
Перемещающие итераторы
Перегрузка методов для вызова посредством временных объектов.
Класс move_iterator.
Шаблон make_move_iterator
Практические занятия
1. Разработка нетривиальных классов с использованием семантики перемещения
2. Использование семантики перемещения при внедрении
3. Использование семантики перемещения при наследовании
4. Использование перемещающих итераторов
Тема 8. Семантика продвижения типов (forwarding)
8.1 Цели введения продвижения типа Использование forward для уменьшения дублирования текста программы
8.2 Универсальные ссылки.
Вывод компилятором типа при использовании универсальных ссылок.
Отличие от rvalue reference
8.3 forward при наследовании
Использование forward при построении иерархий классов
8.4 forward при внедрении
Использование forward при внедрении объектов нетривиальных классов
Практические занятия
1. Разработка функций с использованием forward
2. Разработка классов с использованием forward
Тема 9. Спецификатор constexpr
9.1 Пользовательские литералы.
Перегрузка operator””.
Пользовательские литералы.
Литералы, предоставляемые стандартной библиотекой: std::string_literals, std::chrono_literals
9.2 Спецификатор constexpr.
Повышение эффективности программы при использовании вычислений на этапе компиляции.
Constexpr-функции, constexpr-«переменные», constexpr-классы. Специфика.
Практические занятия
1. Реализация пользовательского литерала
2. Реализация сonstexpr-функции
3. Реализация constexpr-класса.
Тема 10.Интеллектуальные указатели.
10.1 Шаблон класса unique_ptr
Использование unique_ptr для реализации концепции единоличного владения ресурсом (для надежной работы с динамически выделенной памятью, …)
10.2 Шаблон класса shared_ptr.
Использование shared _ptr для совместного владения ресурсом.
10.3 Шаблон класса weak_ptr Использование weak_ptr для разрыва циклических зависимостей. Класс share_from_this
Практические занятия
1. Реализация задания с использованием unique_ptr
2. Реализация задания с использованием shared_ptr
3. Реализация задания с использованием weak_ptr