• A
  • A
  • A
  • АБВ
  • АБВ
  • АБВ
  • А
  • А
  • А
  • А
  • А
Обычная версия сайта

Бакалаврская программа «Программная инженерия»

Инженерный подход к программированию на C/C++

2020/2021
Учебный год
RUS
Обучение ведется на русском языке
5
Кредиты
Статус:
Курс по выбору
Когда читается:
3-й курс, 1, 2 модуль

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


Воробьев Даниил Владимирович

Программа дисциплины

Аннотация

Курс является вводным для специализации "Промышленная инженерия ПО". В рамках курса рассматривается базовый синтаксис и основные конструкции языка программирования С++, дается множество примеров и практических заданий. Большой акцент делается на инженерной составляющей и объяснению того, как те или иные механизмы языка реализованы и работают физическом уровне. Объясняются основные подходы объектно-ориентированного программирования, также обсуждаются вопросы имплементации данных подходов с помощью языка С++. Практические задания в рамках курса проверяются автоматической системой тестирования, при успешном прохождении тестов проводится код-ревью. Данный подход способствует выработке профессиональных навыков написания качественного кода, что является одной из ключевых задач специализации в целом. Курс сопровождается факультативом "Введение в инженерию ПО", предназначенным для тех слушателей курса, кто хочет получить более углубленные инженерные знания в данной области. Курс читается в 1-2 модулях.
Цель освоения дисциплины

Цель освоения дисциплины

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

Содержание учебной дисциплины

  • Знакомство
    Авторы языка C, C++. Даты выхода стандартов, периодичность выхода. Основные конференции
  • Структура программы
    Область видимости: Potential Scope, Actual Scope Ошибки компиляции: лексические, синтаксические, семантические Ошибки времени выполнения Память процесса. Выполняемые файлы. Секции. Свойства секций. Стек нити. Куча
  • Объявления
    Определение идентификатора. Пример корректного и некорректного идентификатора. Память: ячейка (cell), адрес, байт, слово. Endian Определение переменной. Пример переменной. Размещение переменных. Стековый фрейм. Фундаментальные типы: char, int, float, double, bool, wchar_t, void Модели данных: LP32, ILP32, LLP64, LP64 Спецификаторы типов: short, signed, unsigned, long, long long Типы фиксированного размера: int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t Прямой код. Смещенный код. Обратный код. Дополненный код. Неявные преобразования типов: Promotion: Integral promotion, Float-point promotion Conversion: Integral conversion, Float-point conversion Константы: указатель на константные данные, константный указатель, константный указатель на константные данные Определение единицы трансляции One definition rule
  • Операторы
    Операторы: Precedence, Associativity Арифметические операторы: правоассоциативные, левоассоциативные Инкремент / Декримент. Отличие постфиксного от префиксного. Оператор присваивания Логические операторы Операторы сравнения Операторы доступа Другие: тернарный, запятая Специальные: sizeof, alignof, static_cast, С-style cast Выравнивание полей структуры Категории выражений до C++11: lvalue , rvalue Перегрузка функций Аргументы по умолчанию
  • Управляющие конструкции
    Управляющие конструкции: if, else if, else, for, while, do-while, switch, break, continue, return. Ассемблерное представление
  • Указатели
    Объявление: на объект, на тип void, на функцию, на поля и методы структуры Примеры использования Связь с C-массивов (C-array) Операции с указателями Операторы new, delete, delete[], new[] Утечка памяти и двойное удаление Передача по значению и по указателю
  • Ссылки
    Объявление Примеры использования Различия между ссылками и указателями Висячая ссылка (dangling reference) Передача по значению и по ссылке
  • Принципы ООП
    Принципы ООП: инкапсуляция, наследование, полиморфизм Инкапсуляция: пользовательские типы class и struct, спецификаторы доступа public, protected, private
  • Конструкторы и деструктор
    Конструктор по умолчанию (default constructor) Конструктор копирования (copy constructor) Ключевые слова default, delete Перегрузка конструкторов Сокрытие имен (Name hiding) Ключевое слово this Списки инициализации Ключевое слово explicit Деструктор Rule of three
  • Методы
    Константные методы Ключевое слово mutable Статические переменные Статические поля Статические методы
  • Перегрузка операторов
    Ключевое слово friend Перегрузка операторов: бинарные:(+. -, *, / ), сравнения унарные, ++, --, оператора приведения типа Определение функтора Определение компаратора Ограничения на перегрузку операторов: 1) :: ; . ; .*; ?: - не перегружаются 2) Precedence и Arity оператора не изменяются
  • Наследование и полиморфизм
    Наследование Объявление наследования Передача по ссылке на Base Спецификатор доступа по умолчанию при наследовании для struct / class Взаимоотношение спецификаторов при наследовании Сокрытие имен (Name hiding): 1) использование :: для обращения к имени 2) использование using для обращения к имени Порядок вызова конструкторов и деструкторов при наследовании Множественное наследование Diamond problem: 1) разрешения неоднозначности с :: 2) разрешение неоднозначности с помощью виртуального наследования Полиморфизм Определение полиморфного класса Указание virtual в производных классах Порядок вызова виртуальных функций Указатель на базовый класс Виртуальные функции и аргументы по умолчанию Таблица виртуальных функций Чисто виртуальная функция, абстрактный класс Виртуальный деструктор Идентификатор со специальным значением override Операторы приведения типов в применении к наследованию: static_cast, reinterpret_cast, dynamic_cast Паттерны проектирования Поведенческие: Команда, Наблюдатель, Посредник, Итератор, Состояние, Посетитель Порождающие: Строитель, Абстрактная фабрика, Прототип, Синглтон Структурные: Легковес, Компоновщик, Фасад, Декоратор, Прокси
  • Шаблоны
    Шаблонный класс и шаблонная функция Параметры шаблонов: type template parameter, non-type template parameter, template template parameter Указание параметров по умолчанию Определение инстанциации шаблона Специализации шаблонов: полная, частичная Единообразность parameter list у функций Отсутствие частичной специализации у функций Определение статического полиморфизма. Перегрузка функций и шаблоны Curiously Recurring Template Pattern (CRTP) Шаблонный алиас Использование typename для разрешения коллизий при доступе к полю Реализация type_traits с помощью шаблонных структур и typedef’ов: remove_const, remove_reference. Правила вывода типов для шаблонов Упорядочивание кандидатов при перегрузке Пакет параметров (template parameter pack) Вариативный шаблон (variadic template) Выделение в списке аргументов Head параметра и Tail пакета параметров для итерирования по списку аргументов Реализация std::less, std::greater Список типов и операции над ним: вычисление длины,обращение по индексу,поиск типа,добавление в конец,удаление первого вхождения заданного типа,удаление всех вхождений заданного типа Техники и вспомогательные инструменты: static_assert до C++11 на макросах, локальные классы, отображение целых чисел в типы, отображение типа в тип, выбор типа, проверка приводимости типа на этапе компиляции, type_traits: is_ptr, is_fundamental Реализация контейнеров: std::array, std::map
  • Исключения
    Оператор throw и конструкция try...catch. Примеры стандартных операторов, генерирующих исключения. Разница между исключениями и ошибкой времени выполнения Ошибки, не являющиеся исключениями Ловля всех исключений Пример оператора, генерирующего исключение -> Генерация ис Повторное пробрасывание исключения Отсутствие приведения типов для встроенных типов Приведение типов при наследовании Правило объявления исключений от частного к общему Перехват исключений по ссылке Перехват исключений по значению Спецификация исключений до C++11: список исключений throw std::unexpected, std::unexpected_handler, std::terminate Спецификация исключений после C++11: спецификатор и оператор noexcept Свойства спецификатора noexcept Применение оператора noexcept Исключения в конструкторах Проблема утечки памяти при исключениях. Разрешение проблемы посредством помещения ресурсов во временный объект Исключения в деструкторах. std::uncaught_exception Гарантии безопасности при исключениях: no guarantee, basic guarantee, strong guarantee, no throw guarantee
Элементы контроля

Элементы контроля

  • неблокирующий практические задания
  • неблокирующий Экзамен (устный)
Промежуточная аттестация

Промежуточная аттестация

  • Промежуточная аттестация (2 модуль)
    0.6 * практические задания + 0.4 * Экзамен (устный)
Список литературы

Список литературы

Рекомендуемая основная литература

  • Мейерс С. - Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов - Издательство "ДМК Пресс" - 2007 - 294с. - ISBN: 5-94074-033-2 - Текст электронный // ЭБС ЛАНЬ - URL: https://e.lanbook.com/book/1224
  • Мэйерс С. - Эффективное использование C++. 55 верных способов улучшить структуру и код ваших прграмм - Издательство "ДМК Пресс" - 2008 - 300с. - ISBN: 5-94074-304-8 - Текст электронный // ЭБС ЛАНЬ - URL: https://e.lanbook.com/book/1245

Рекомендуемая дополнительная литература

  • О’Двайр А. - Осваиваем C++17 STL - Издательство "ДМК Пресс" - 2018 - 352с. - ISBN: 978-5-97060-663-6 - Текст электронный // ЭБС ЛАНЬ - URL: https://e.lanbook.com/book/116126