СпецкурсCxx/Программа

Факультативный спецкурс «Программирование на C++»

Антон Дедов
Дмитрий Иртегов
отдельно благодарим за участие в обсуждении Каменского Никиту и преподавателя ФИТ В. Рылова

Цели и задачи


Цели курса:
  1. Ознакомление с культурой и принятыми практиками программирования в сообществе C++, знакомство с современным состоянием языка.
  2. Получение знаний, необходимых для создания более качественного и безопасного кода.
  3. Формирование сознательного отношения к использованию тех или иных средств языка, а не изучение «крутых» трюков.

Основные темы курса:
* проектирование классов, принципы объектно-ориентированного проектирования;
* использование стандартной библиотеки и ее признанных расширений;
* безопасность исключений и требования, которые это налагает на дизайн.

Содержание курса

Курс условно разбит на несколько модулей. Каждый модуль логически объединяет смежные темы.

Модули содержат специфические примеры кода, которые, демонстрируют распространенные техники написания программ на C++, а так же использование стандартной библиотеки.

Список модулей:
  1. Введение в язык
  2. Объектно-ориентированное программирование
  3. Исключения и обработка ошибок
  4. Шаблоны
  5. Введение в стандартную библиотеку C++

Модули естественным образом разбиваются на части, минимальная единица – лекция. Лекции разных модулей могут перемежаться для облегчения понимания смежных тем из других модулей.

Введение в язык

Лекция 1

  1. Объявления и определения.
  2. Встроенные типы данных. Переменные; квалификаторы const.
  3. Указатели. Массивы. Строковые литералы. Ссылки.
  4. Области видимости имен.
  5. Структуры как средство группировки данных.

Лекция 2

  1. Функции.
    Аргументы функций. Объявление и определение. Перегрузка и поиск.
  2. Правило оформления заголовочных файлов.
  3. Классы, структура классов.
    Конструкторы и деструкторы. Ограничение доступа. Специальные методы. Константность.

Лекция 3

  1. Объекты.
    Конструирование. Временные объекты. Расположение объектов в памяти. Время жизни объектов.
  2. Пространства имен.
    Определение. Объявление членов пространств имен. Безымянные пространства имен. Using директивы и объявления. Псевдонимы. Композиция и отбор. Поиск имен.

Лекция 4

  1. Исключения.
    Жизненный цикл исключения. Исключения и конструкторы. И деструкторы. Функции terminate, unexpected и uncaught_exception. Стандартные исключения. Группировка исключений. RAII.

Советы по проектированию классов

Лекция 5

  1. Проектирование классов исходя из их назначения.
    Классы значений. Базовые классы. Классы исключений.
  2. Избегайте наследования классов не предназначенных для этого.
  3. Делайте нетерминальные классы абстрактными.
  4. Клонирование как альтернатива копированию.

Принципы объектно-ориентированного проектирования

Лекция 6

  1. Признаки гниения дизайна.
  2. Ценности гибкого подхода к разработке ПО.
  3. Принцип персональной ответственности.
  4. Принцип «открытия-закрытия».
  5. Принцип подстановки Лисковой.

Лекция 7

  1. Принцип инверсии зависимостей.
  2. Принцип отделения интерфейса.
  3. Пример «загнивающего» дизайна.

Обработка ошибок, часть I

Лекция 8

  1. Что является ошибкой?
  2. Стратегия обработки ошибок.
    Преимущества использования исключений. Ситуации когда использование исключений не дает преимуществ.
  3. Использование утверждений.
    Когда следует использовать утверждения. Мертвые программы не лгут.

Шаблоны

Лекция 9

  1. Шаблоны.
    Зачем нужны шаблоны? Определение шаблона. Инстанцирование. Компиляция шаблона.
  2. Шаблоны функций.
    Вывод аргументов шаблона. Перегрузка шаблонов функций.

Лекция 10

  1. Шаблоны классов.
    Определение шаблонного класса. Имена шаблонных классов. Аргументы по умолчанию. Аргументы не являющиеся типами.
  2. Полная и частичная специализация шаблонов классов.
  3. Использование шаблонов классов.

Обработка ошибок, часть II

Лекция 11

  1. Разработка кода безопасного с точки зрения исключений.
  2. Гарантии безопасности исключений.

Стандартная библиотека

Лекция 12

  1. Состав и назначение стандартной библиотеки.
  2. Контейнерные шаблонные классы.
    Последовательности и ассоциативные контейнеры. Назначение и различие стандартных контейнеров. Критерии выбора контейнера.

Лекция 13

  1. Стандартные алгоритмы.
    Описание наиболее популярных алгоритмов STL: find, for_each, copy, transform. Что делает алгоритм remove. Идиома erase(remove).
  2. Итераторы.
    Что такое стандартный итератор STL. Типы итераторов. Как создавать итераторы совместимые со стандартными.

Литература

Список литературы составлен в алфавитном порядке.

  1. Андрей Александреску. Современное проектирование на С++. Обобщенное программирование и прикладные шаблоны проектирования. // 2002
  2. Гради Буч. Объектно-ориентированный анализ и проектирование. С примерами приложений на C++. // 2000; В библиотеке НГУ
  3. Дэвид Вандевурд, Николаи М. Джосаттис. Шаблоны C++. Справочник разработчика. // 2003; В библиотеке НГУ
  4. Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес. Приемы объектно-ориентированного проектирования. Паттерны проектирования. // 2001; В библиотеке НГУ
  5. Скотт Мейерс. Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов. // 2000 В библиотеке НГУ
  6. Скотт Мейерс. Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов. // 2000 В библиотеке НГУ
  7. Скотт Майерс. Эффективное использование STL. // 2002
  8. Герб Саттер. Решение сложных задач на C++. // 2002
  9. Герб Саттер. Новые сложные задачи на C++: 40 новых головоломных примеров с решениями. // 2005; В библиотеке НГУ
  10. Герб Саттер и Андрей Александреску. Стандарты программирования на C++: 101 правило и рекомендация. // 2005; В библиотеке НГУ
  11. Бьерн Страуструп. Язык программирования C++. // 2001; В библиотеке НГУ
  12. Бьерн Страуструп. Дизайн и эволюция языка C++. // 2000
  13. ISO/IEC 14882:1998(E), Programming Languages??? C++ (ISO and ANSI C++ standard).
  14. Robert C. Martin. Design Principles and Design Patterns. // objectmentor.com 2000

Полезные ссылки