Программирование на C++, часть 2
Санкт-Петербург, весна 2016
Описание
Этот курс – продолжение курса C++ 1. Весенний семестр будет состоять из трёх частей:
Стандартная библиотека шаблонов
Продвинутые возможности C++: обработка ошибок, RTTI, метапрограммирование
Стандарты C++11 и С++14.
Лекции будут проходить по средам в Таймсе в 18:30. В среднем лекция занимает два часа, т.е. заканчивается к 20:30, но могут быть незначительные отклонения в обе стороны.
Оценка выставляется по результатам домашних заданий, планируется три домашних задания за семестр.
Преподаватели
Список лекций
Общие идеи STL. Итераторы вместо индексов. Работа с последовательными контейнерами (vector, list, deque).
Работа с ассоциативными контейнерами (map, set). Версии контейнеров с повторяющимися элементами. Задание упорядочивания для пользовательских типов. Категории итераторов. Итераторы в обратном направлении. Требования к итераторам. Как написать свой итератор. Идея iterator_traits.
Требования алгоритмов к элементам и последовательностям. Алгоритмы для произвольных последовательностей. Алгоритмы для упорядоченных последовательностей. Алгоритмы изменяющие последовательности. Другие категории алгоритмов. Как написать собственный алгоритм. Как специализировать алгоритм для конкретного типа итераторов/элементов. Создание собственных функторов.
Концепция исключений. Стандартные классы исключений. Спецификация исключений. Стратегии обработки исключений. Почему не стоит бросать встроенные типы. Исключения в конструкторе. Исключения в списке инициализации. Недопустимость исключений в деструкторах.
Гарантии безопасности исключений. В каких случаях мы можем обеспечить строгую гарантию исключений. Использование swap для безопасности. Использование auto_ptr (unique_ptr) для обеспечения безопасности исключений. Проектирование с учётом исключений.
Представление в памяти. Вызов конструкторов. Разрешение имён, перегрузка виртуальных функций. Несколько таблиц вирт. функций. Преобразование указателей. Виртуальное наследование.
Преобразования в стиле C++: static_cast, const_cast, reinterpret_cast, dynamic_cast. Преимущества над преобразованиями в стиле C. В каких случаях преобразование в стиле C приводит к ошибкам (множественное наследование).
Общие сведения о новых стандартах.
Вывод типов: auto и decltype.
Зачем нужны move-конструкторы?
Rvalue-references.
Как писать обобщённый код: std::move и std::forward, универсальная ссылка.
Универсальная инициализация общая для классов и структур, std::initializer_list.
Лямбда выражения, замыкания, std::function.
Новинки в стандартной библиотеки.
Безопасность в C++11/14: ещё раз об умных указателях и исключениях.
Многопоточность в С++: базовые примитивы и средства для написания многопоточного кода.
И ещё немного о прочих возможностях C++11/14.
SFINAE и enable_if. CRTP. Определение наследование одного класса от другого. Алгебраические структуры на шаблонах. Поддержка метапрограммирования в Boost.