Программирование на C++, часть 2

Санкт-Петербург, весна 2016

Описание

Этот курс – продолжение курса C++ 1. Весенний семестр будет состоять из трёх частей:

  1. Стандартная библиотека шаблонов

  2. Продвинутые возможности C++: обработка ошибок, RTTI, метапрограммирование

  3. Стандарты C++11 и С++14.

Лекции будут проходить по средам в Таймсе в 18:30. В среднем лекция занимает два часа, т.е. заканчивается к 20:30, но могут быть незначительные отклонения в обе стороны.

Оценка выставляется по результатам домашних заданий, планируется три домашних задания за семестр.

Преподаватели

Список лекций

STL: последовательные контейнеры

Общие идеи STL. Итераторы вместо индексов. Работа с последовательными контейнерами (vector, list, deque).

STL: ассоциативные контейнеры и итераторы

Работа с ассоциативными контейнерами (map, set). Версии контейнеров с повторяющимися элементами. Задание упорядочивания для пользовательских типов. Категории итераторов. Итераторы в обратном направлении. Требования к итераторам. Как написать свой итератор. Идея iterator_traits.

STL: алгоритмы

Требования алгоритмов к элементам и последовательностям. Алгоритмы для произвольных последовательностей. Алгоритмы для упорядоченных последовательностей. Алгоритмы изменяющие последовательности. Другие категории алгоритмов. Как написать собственный алгоритм. Как специализировать алгоритм для конкретного типа итераторов/элементов. Создание собственных функторов.

Обработка ошибок

Концепция исключений. Стандартные классы исключений. Спецификация исключений. Стратегии обработки исключений. Почему не стоит бросать встроенные типы. Исключения в конструкторе. Исключения в списке инициализации. Недопустимость исключений в деструкторах.

Гарантии безопасности исключений. В каких случаях мы можем обеспечить строгую гарантию исключений. Использование swap для безопасности. Использование auto_ptr (unique_ptr) для обеспечения безопасности исключений. Проектирование с учётом исключений.

Множественное наследование, С++ касты и RTTI

Представление в памяти. Вызов конструкторов. Разрешение имён, перегрузка виртуальных функций. Несколько таблиц вирт. функций. Преобразование указателей. Виртуальное наследование.

Преобразования в стиле C++: static_cast, const_cast, reinterpret_cast, dynamic_cast. Преимущества над преобразованиями в стиле C. В каких случаях преобразование в стиле C приводит к ошибкам (множественное наследование).

Стандарт C++11/14: вывод типов и move семантика

Общие сведения о новых стандартах.

Вывод типов: auto и decltype.

Зачем нужны move-конструкторы?

Rvalue-references.

Как писать обобщённый код: std::move и std::forward, универсальная ссылка.

Стандарт C++11/14: универсальная инициализация, лямбда выражения, стандартная библиотека

Универсальная инициализация общая для классов и структур, std::initializer_list.

Лямбда выражения, замыкания, std::function.

Новинки в стандартной библиотеки.

Стандарт C++11/14: безопасность и многопоточность

Безопасность в C++11/14: ещё раз об умных указателях и исключениях.

Многопоточность в С++: базовые примитивы и средства для написания многопоточного кода.

И ещё немного о прочих возможностях C++11/14.

Метапрограммирование на C++

SFINAE и enable_if. CRTP. Определение наследование одного класса от другого. Алгебраические структуры на шаблонах. Поддержка метапрограммирования в Boost.