Обучение языку C++, часть 1
Новосибирск, осень 2017
Описание
Первая часть курса Программирование на C++ в Новосибирске.
Критерии оценки
Оценка | Баллы |
---|---|
зачёт | 14 |
хорошо | 20 |
отлично | 26 |
Максимум баллов за курс: 30
Материалы семинаров
https://github.com/ivafanas/cpp_shad_students
Требования к домашним заданиям
Проверьте, что:
- задание оформлено как отдельный приватный проект в gitlab.com
- семинарист ivafanas добавлен в проект как разработчик
- отослано письмо семинаристу на ivafanas(собачка)gmail.com
- в заголовке письма указаны имя, фамилия, задание
- в теле письма дана ссылка на проект в gitlab
- проект содержит файл README.md, со следующими пунктами:
- о чём проект
- инструкции сборки
- инструкции по использованию
- тестирование
- есть unit-тесты (разумное количество)
- unit-тесты проходят (все)
- если для сборки юнит-тестов нужен специальный ключ для cmake, он задокументирован в README
- наличие интеграционных тестов не обязательно, но приветствуется
- поддержана система генерации проектов cmake
- список может пополниться по факту общения со студентами
Преподаватели
Список лекций
Вступительная лекция. Познакомимся, обсудим организационные вопросы, а потом изучим (большинство слушателей, скорее, вспомнят) базовый объём знаний, необходимый для программирования на C++:
- Как выглядит программа на C++, что она обязательно должна содержать.
- Что делает с программой компилятор, чтобы получился исполняемый файл.
- Как вводить данные с клавиатуры и выводить их на экран, и какие вообще бывают данные.
- Управляющие конструкции языка.
- Обзор возможностей, встроенных в язык.
Лекция посвящена функциям и особенностям их работы. Обсудим следующие темы:
- Порядок вычисления аргументов при вызове функций.
- Операторы, порядок вычисления выражений. Особенности && и ||.
- Перегрузка функций и операторов.
- Шаблоны функций. Специализация.
- Пространства имён. Анонимные пространства имён.
Обсудим основу объектно-ориентированной парадигмы — классы:
- Атрибуты и методы, уровни доступа. const и mutable
- Конструирование, копирование и разрушение объектов.
- Наследование и виртуальные методы. Абстрактные классы.
- Особенности определения операторов в виде методов класса.
Продолжим знакомиться с объектно-ориентированными возможностями языка:
- Непубличное наследование.
- Как устроена таблица виртуальных методов.
- Порядок вызова конструкторов и деструкторов при наследовании.
- Множественное наследование: конструирование и разрушение, конфликты имён, виртуальное наследование.
Поговорим о шаблонах классов:
- Синтаксис и особенности компиляции.
- Специализация.
Обсудим классы контейнеров, имеющиеся в стандартной библиотеке.
Обсудим механизм исключений:
- Что это такое, как устроено.
- Как бросать и как ловить.
- Стандартные и собственные классы исключений.
- Особые случаи: исключения в конструкторах и деструкторах.
- Гарантии при работе с исключениями: noexcept, строгая, базовая, никакая.
Лекция по заявкам аудитории! Обсудим накопившиеся непонятные моменты:
- Умные указатели. Почему они разные, для чего какой подходит.
- Модификаторы const, mutable, volatile (?).
- Модификаторы inline, static.
- Указатели на функции и методы.
- Введение в преобразования типов: reinterpret_cast, static_cast, const_cast, dynamic_cast.
- Дополнения про шаблоны. Использование using, typename и decltype.
Обсудим лямбда-функции:
- Контекст, захват и передача параметров.
- Определение возвращаемого типа.
- Использование mutable.
- Сохранение лямбда-функции как объекта.
Также уделим время вопросам, на которые не хватило времени на прошлой лекции:
- Введение в преобразования типов: reinterpret_cast, static_cast, const_cast, dynamic_cast.
- Дополнения про шаблоны. Использование using, typename и decltype.
Метапрограммирование — это программирование алгоритмов на шаблонах. Рассмотрим некоторые простые случаи:
- Вычисления на шаблонах. Рекурсивные шаблоны.
- Type traits, std::is_same.
- Проверки времени компиляции (static_assert).
Обсудим тестирование программ:
- Виды тестирования.
- Модульные тесты как основа автоматического тестирования.
- Написание тестируемого кода.
- Методология Test driven development.
В заключение курса обсудим некоторые вопросы, связанные с интернационализацией и локализацией программ.
- Суть проблемы, терминология.
- Кодировки, Unicode.
- GNU gettext.
- Другие варианты решения.