+7 (812) 703-02-02 info@hse.spbstu.ru

DEV-C210. Объектно-ориентированное программирование на языке С++. Углубленное изучение

Длительность дисциплины: 48 ак.ч.


Аннотация

Данный курс является третьим в линейке курсов по разработке программного обеспечения, предлагаемых нашим учебным центром и представляет собой продолжение курса DEV-C200. Объектно-ориентированное программирование на языке С++. Базовый уровень

Последний в линейке, посвященной С++, курс охватывает понятия следующего уровня абстракции (шаблоны), а также относительно новые для языка С++ средства обеспечения надежности и безопасности кода.

В настоящее время наиболее перспективным становится следующий (более высокий по сравнению с классами) уровень абстрактного программирования – создание своих и использование стандартных шаблонов и обобщенных алгоритмов стандартной библиотеки. Так как определяющим фактором конкурентоспособности становится время разработки программного продукта (time to market), современный программист должен уметь не только разрабатывать собственные эффективные процедуры и классы, но и эффективно применять те средства, которые уже разработаны и отлажены профессионалами. Соответствующий раздел курса посвящен знакомству со стандартной библиотекой шаблонов (STL).

Данная программа интегрирована с инициативой C++ Institute , и готовит к сдаче сертификационного экзамена CPP.

Иногда возникает необходимость определения точного типа объекта во время выполнения программы. Этот механизм известен под названием RTTI (Run Time Type Identification) и в С++ появился относительно недавно. В данном разделе курса изучаются средства языка, поддерживающие RTTI.

Каждый программный продукт должен быть «защищен» разработчиком от возможных «аварийных» ситуаций. При этом далеко не лучшей идеей является завершение приложения при возникновении любой аварийной ситуации. С++ поддерживает механизм защиты от возможных ошибок – обработка исключительных ситуаций, а в предлагаемом курсе рассматриваются различные аспекты этого механизма.


Знания и умения, полученные в результате изучения

В результате освоения программы обучающийся должен уметь:
• создавать шаблоны функций и шаблоны классов для решения конкретных задач,
• использовать обобщенные алгоритмы, контейнеры, предикаты и итераторы стандартной библиотеки С++ для ускорения процесса разработки программного продукта;
• повышать надежность программы за счет обработки исключительных ситуаций;
• применять способы динамического определения типа объектов при решении нетривиальных задач.

В результате освоения программы обучающийся должен знать:
• внутреннее устройство контейнеров стандартной библиотеки;
• средства, предоставляемые стандартной библиотекой С++ для обобщенного программирования;
• средства, предоставляемые языком С++ для поддержки RTTI;
• средства, предоставляемые языком С++ и стандартной библиотекой С++ для обработки нештатных ситуаций.

В результате освоения программы обучающийся должен приобрести практический опыт:
• обобщенного программирования;
• обработки нештатных ситуаций;
• работы со средствами языка С++ для определения типа объекта во время выполнения программы;
• использования возможностей стандартной библиотеки С++ для обобщенного программирования.

Содержание дисциплины

Тема 1. Защищенное наследование

1.1 Спецификаторы наследования private и protected. 
Отношение между классами «подобен»
Специфика защищенного наследования. 
Использование защищенного наследования для изоляции пользователя от использования функциональности базового класса. 
1.2 Ключевое слово friend и защищенное наследование. 
Защищенное наследование при построении иерархий классов
Использование защищенного наследования для изоляции классов потомков от использования функциональности базового класса

Тема 2. Множественное наследование
2.1 Отличия множественного и одиночного наследования.
Построение иерархий классов при множественном наследовании. 
Множественное наследование и полиморфизм
2.2 Специфика множественного наследования
Проблемы, возникающие при множественном наследовании. 
Множественное наследование и директива using. 
Виртуальное наследование
Практические занятия
Построение иерархий классов при множественном наследовании

Тема 3. Механизм RTTI
3.1 Оператор static_cast и иерархии классов
Использование оператора static_cast для определения типа на этапе компиляции применительно к классам, связанным наследованием
3.2 Динамическая идентификация типа.
Оператор dynamic_cast, оператор typeid, класс type_info. 
Встроенный механизм динамического определения типа
Практические занятия
1. Использование static_cast при реализации гетерогенного двухсвязного списка
2. Использование механизма динамического определения типа для реализации гетерогенного двухсвязного списка

Тема 4. Исключительные ситуации
4.1 Понятие исключительной ситуации.
Обзор способов обработки аварийных ситуаций. 
4.2 Встроенные средства языка С++ для обработки исключительных ситуаций.
Встроенные средства С++ для обработки исключительных ситуаций: операторы try, catch, throw
4.3 Механизм обработки исключительной ситуации
Генерация исключения и способы приема объекта-исключения обработчиком исключительной ситуации. 
Последовательность выполнения кода и выбор исключений. 
Что может предусмотреть программист в обработчике исключения. 
Исключения в конструкторах и деструкторах. 
Стандартные исключения
4.4 Специфика обработки исключений средствами С++
Function-level try-блок. 
Обработка непредусмотренных исключений. 
Спецификация исключений. 
Специфика оператора new
Практические занятия
Использование механизма обработки исключений при реализации стека

Тема 5. Шаблоны
5.1 Идеи обобщенного программирования
Способы обобщения действий: перегрузка имен функций, макросы с параметрами. 
Зачем нужны шаблоны.
5.2 Понятия, связанные с шаблонами
Использование ключевого слова template для обобщения. 
Параметры шаблона. Механизм инстанцирования.
5.3 Шаблоны функций Специфика шаблонов функций. 
Специализация шаблона функции.
5.4 Шаблоны классов Специфика шаблона класса. 
Специализация шаблона класса. Эмуляция шаблона «vector». 
Эмуляция шаблона «list». 
Введение понятия псевдоним типа. 
Реализация итератора для разных структур данных.
Практические занятия
1. Реализация шаблона функции
2. Реализация шаблона ограниченного стека посредством встроенного массива
3. Реализация шаблона неограниченного стека посредством односвязного списка
4. Реализация шаблона кольцевой очереди посредством динамического массива

Тема 6. Контейнеры стандартной библиотеки
6.1 Базовые контейнеры
Обзор и примеры использования контейнеров std::vector, std::list, std::deque
6.2 Адаптеры базовых контейнеров
Обзор и примеры использования контейнеров std::stack, std::queue, std::priority_queue
6.3 Ассоциативные контейнеры
Обзор и примеры использования контейнеров std::set, std::multiset, std::map, std::multimap
Практические занятия
1. Использование контейнеров std::vector, std::list, std::deque для реализации поставленных задач
2. Использование контейнеров std::stack, std::queue, std::priority_queue для реализации поставленных задач
3. Использование контейнеров std::set, std::multiset, std::map, std::multimap для реализации поставленных задач

Тема 7. Итераторы
7.1 Понятие итератора
Реализация прямых и реверсивных итераторов для разных структур данных
7.2 Назначение и виды итераторов
Итераторы-адаптеры. Потоковые итераторы. Итераторы вставки
Практические занятия
1. Использование прямых и реверсивных итераторов для работы с контейнерами
2. Использование потоковых итераторов для вывода элементов контейнера на экран и в файл
3. Использование и итераторов вставки для манипулирования контейнерами

Тема 8. Обобщенные алгоритмы стандартной библиотеки
8.1 Понятие обобщенного алгоритма
Цели введения обобщенных алгоритмов. Реализация обобщенного алгоритма.
8.2 Обзор, примеры использования и эмуляция некоторых (часто используемых) обобщенных алгоритмов стандартной библиотеки
Эмуляция алгоритма for_each(). 
Эмуляция алгоритмов find(), find_if(). 
Алгоритмы count(), count_if(). 
Алгоритмы sort(), merge(), transform()
Практические занятия
1. Использование алгоритма for_each() для работы с последовательностями
2. Использование алгоритмов find(), find_if()) для работы с последовательностями
3. Использование алгоритмов count(), count_if() для работы с последовательностями
4. Использование алгоритма sort(), merge(), transform()для работы с последовательностями

Тема 9. Предикаты
9.1 Назначение предикатов. 
Способы задания предикатов
Цель введения предикатов. 
Реализация предиката посредством глобальной функции. 
Реализация предиката посредством шаблона глобальной функции. 
Реализация предиката посредством функционального объекта. 
Реализация предиката посредством шаблона функционального объекта
9.2 Предикаты, предоставляемые стандартной библиотекой. 
Универсальный способ обобщения предиката.
Шаблоны структур, предоставляемые стандартной библиотекой для задания предикатов. 
Использование шаблонов function и mem_fn для универсального задания пользовательского предиката
Практические занятия
1. Использование предикатов стандартной библиотеки
2. Разработка пользовательских предикатов