Факультативный спецкурс «Программирование на C++»
Антон Дедов
Дмитрий Иртегов
Никита Каменский
отдельно благодарим за участие в обсуждении преподавателя ФИТ В. Рылова
Цели курса:
Ознакомление с культурой и принятыми практиками программирования в сообществе C++, знакомство с современным состоянием языка.
Получение знаний, необходимых для создания более качественного и безопасного кода.
Формирование сознательного отношения к использованию тех или иных средств языка, а не изучение «крутых» трюков.
Основные темы курса:
проектирование классов;
использование стандартной библиотеки и ее признанных расширений;
безопасность исключений и требования, которые это налагает на дизайн.
Курс условно разбит на несколько модулей. Каждый модуль логически объединяет смежные темы.
Модули содержат специфические примеры кода, которые, демонстрируют распространенные техники написания программ на C++, а так же использование стандартной библиотеки.
Список модулей:
Введение в язык
Объектно-ориентированное программирование на C++
Исключения
Шаблоны
Введение в стандартную библиотеку C++
Модули естественным образом разбиваются на части, минимальная единица – лекция. Лекции разных модулей могут перемежаться для облегчения понимания смежных тем из других модулей.
Длительность: 2часа
Назначение языка, краткая история, основные возможности.
Объявления и определения.
Встроенные типы данных. Переменные; квалификаторы const.
Выражения, операторы и управляющие структуры.
Указатели. Массивы. Строковые литералы. Ссылки.
Области видимости переменных.
Структуры как средство группирования данных.
Функции.
Объявление и определение. Аргументы и возвращаемые значения. Аргументы по умолчанию. Указатели на функцию. Inline.
Перегрузка функций и операторов. Разрешение имен функций при перегрузке.
Структура программы. Понятие единицы трансляции. Понятие о правиле одного определения.
Длительность: 2часа
Классы.
Члены класса.
Ограничения доступа как средство для поддержки инкапсуляции. Дружба.
Объекты. Определение переменных-объектов.
Конструкторы и деструкторы классов. Порядок инициализации и уничтожения членов.
Способы размещения объектов в памяти: автоматический, динамический, статический.
Динамическая память. Операторы new, delete, delete[].
Генерируемые компилятором определения членов классов.
Использование объектов: вызов методов, передача объекта в качестве параметра функции. Понятие временного объекта.
Передача объектов по значению и по ссылке.
Длительность: 1час, как и все последующие лекции.
Пространства имен.
Пространства имен как область видимости. Открытость пространств имен. Безымянные пространства имен. Квалификаторы using. Fully specified name.
Поиск и разрешение имен. Поиск Кёнинга.
Иерархии классов.
Уровни доступа наследования. Иерархии is-a, и реализован посредством. Агрегирование как альтернатива наследованию.
Конструкторы и деструкторы.
Порядок инициализации классов предков. Порядок вызовов деструкторов. Виртуальные деструкторы.
Виртуальные функции. Абстрактные классы.
Различие между перегрузкой, замещением и сокрытием функций.
Введение в множественное наследование.
Назначение механизма исключений.
Группировка исключений.
Поимка исключений, порядок. Поимка по константной ссылке. Re-throw.
Ресурсы и исключения.
Исключения в конструкторах. Использование std::auto_ptr и boost::shared_ptr. Идиома RAII.
Исключения и деструкторы.
Основные принципы ООП.
Проектирование классов для разного назначения: объекты-значения, базовые классы, классы исключений, шаблоны классов и т.п.
Open-Close Principle как одна из целей объектно-ориентированной архитектуры.
Принцип подстановки Лисковой.
Принцип интерфейса.
Какие функции составляют интерфейс класса. Какие функции должны быть членами класса, какие нет.
Использование абстрактных классов.
Делайте нетерминальные классы абстрактными. Dependency Inversion Principle. Interface Segregation Principle.
Инкапсуляция и проектирование интерфейса.
Классы обладающие поведением должны скрывать данные. Смешивание открытых и закрытых членов вредно.
Паттерн невиртуального интерфейса (NVI pattern).
Вопросы перегрузки операторов:
Перегрузка new, delete.
Перегрузка операторов ++, ->, [] и т.п.
Перегрузка операторов +, >>, <<.
Какие операторы не рекомендуется перегружать.
Вложенные классы.
Идиома Pimpl.
Паттерн Proxy.
Понятие шаблона. Инстанцирование.
Шаблонные функции. Перегрузка.
Шаблоны классов.
Шаблоны членов классов.
Обзор и организация стандартной библиотеки.
Использование строк.
Контейнеры. Типы контейнеров.
Последовательности, ассоциативные контейнеры, адаптеры контейнеров. Требования к стандартным контейнерам.
Специализация шаблонов классов.
Частичная специализация шаблонов классов и шаблонов функций.
Примеры использования шаблонов: классы свойств; паттерн стратегия.
Алгоритмы.
Описание наиболее популярных алгоритмов STL: find, for_each, copy, transform. Что делает алгоритм remove. Идиома erase(remove).
Итераторы.
Что такое стандартный итератор STL. Типы итераторов. Как создавать итераторы совместимые со стандартными.
Введение в потоки STL.
Потоковые итераторы.
Разработка кода безопасного с точки зрения исключений.
Гарантии безопасности исключений (гарантии Абрамса).
Стратегии обработки ошибок и исключительных ситуаций.
Список литературы составлен в алфавитном порядке.
Андрей Александреску. Современное проектирование на С++. Обобщенное программирование и прикладные шаблоны проектирования. // 2002
Гради Буч. Объектно-ориентированный анализ и проектирование. С примерами приложений на C++. // 2000
Дэвид Вандевурд, Николаи М. Джосаттис. Шаблоны C++. Справочник разработчика. // 2003
Эрих Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес. Приемы объектно-ориентированного проектирования. Паттерны проектирования. // 2001
Скотт Майерс. Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов. // 2000
Скотт Майерс. Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов. // 2000
Скотт Майерс. Эффективное использование STL. // 2002
Герб Саттер. Решение сложных задач на C++. // 2002
Герб Саттер. Новые сложные задачи на C++: 40 новых головоломных примеров с решениями. // 2005
Герб Саттер и Андрей Александреску. Стандарты программирования на C++: 101 правило и рекомендация. // 2005
Бьерн Страуструп. Язык программирования C++. // 2001
Бьерн Страуструп. Дизайн и эволюция языка C++. // 2000
ISO/IEC 14882:1998(E), Programming Languages – C++ (ISO and ANSI C++ standard).
Robert C. Martin. Design Principles and Design Patterns. // objectmentor.com 2000
http://public.research.att.com/~bs/ Bjarne Stroustrup's homepage.
http://www.boost.org Boost libraries.
http://www.gotw.ca/gotw Herb Sutter. Guru of the Week.
http://objectmentor.com Object Mentor, Inc.
http://rsdn.ru Russian Software Development Network.
http://ooad.asf.ru Объектно-ориентированный анализ и проектирование.