Программирование на C++, часть 2
Санкт-Петербург, весна 2015
Описание
Продолжение курса «Программирование на С++, часть 1».
Преподаватели
Список лекций
Общие идеи STL. Итераторы вместо индексов. Работа с последовательными контейнерами (vector, list, deque).
Работа с ассоциативными контейнерами (map, set). Версии контейнеров с повторяющимися элементами. Задание упорядочивания для пользовательских типов. Категории итераторов. Итераторы в обратном направлении. Требования к итераторам. Как написать свой итератор. Идея iterator_traits.
Требования алгоритмов к элементам и последовательностям. Алгоритмы для произвольных последовательностей. Алгоритмы для упорядоченных последовательностей. Алгоритмы изменяющие последовательности. Другие категории алгоритмов. Как написать собственный алгоритм. Как специализировать алгоритм для конкретного типа итераторов/элементов. Создание собственных функторов.
Концепция исключений. Стандартные классы исключений. Спецификация исключений. Стратегии обработки исключений. Почему не стоит бросать встроенные типы. Исключения в конструкторе. Исключения в списке инициализации. Недопустимость исключений в деструкторах.
Гарантии безопасности исключений. В каких случаях мы можем обеспечить строгую гарантию исключений. Использование swap для безопасности. Использование auto_ptr (unique_ptr) для обеспечения безопасности исключений. Проектирование с учётом исключений.
Указатели на функции. Указатели на методы. Указатели на члены данных. Использование указателей на функции в качестве функторов. Пример использование указателей на методы - паттерн Listener.
Определение пространств имён. Глобальное пространство имён. Директивы using (2 формы). Поиск имён. Поиск Кёнига (ADL). Поиск имён при наследовании.
Представление в памяти. Вызов конструкторов. Разрешение имён, перегрузка виртуальных функций. Несколько таблиц вирт. функций. Преобразование указателей. Виртуальное наследование.
Преобразования в стиле C++: static_cast,
const_cast, reinterpret_cast,
dynamic_cast. Преимущества над преобразованиями
в стиле C. В каких случаях преобразование в стиле C приводит
к ошибкам (множественное наследование).
Вывод типов. Variadic templates. Rvalue references, move semantics.
SFINAE и enable_if. CRTP. Определение наследование одного класса от другого. Алгебраические структуры на шаблонах. Поддержка метапрограммирования в Boost.