Обучение языку C++, часть 1
Новосибирск, осень 2018
Описание
Первая часть курса Программирование на C++ в Новосибирске.
Критерии оценки
Оценка | Баллы |
---|---|
зачёт | 14 |
хорошо | 20 |
отлично | 26 |
Максимум баллов за курс: 30
Требования к оформлению репозитория
Требования к домашним заданиям
Проверьте, что:
- проект компилируется под все платформы (проверьте windows и linux)
- проект содержит файл README.md, со следующими пунктами:
- о чём проект
- инструкции сборки
- инструкции по использованию
- тестирование
- есть unit-тесты (разумное количество)
- unit-тесты проходят (все)
- unit-тесты написаны через googletest
- если для сборки юнит-тестов нужен специальный ключ для cmake, он задокументирован в README
- наличие интеграционных тестов не обязательно, но приветствуется
- поддержана система генерации проектов cmake
- список может пополниться по факту общения со студентами
Преподаватели
Список лекций
Вступительная лекция. Познакомимся, обсудим организационные вопросы, а потом изучим (большинство слушателей, скорее, вспомнят) базовый объём знаний, необходимый для программирования на C++:
- Как выглядит программа на C++, что она обязательно должна содержать.
- Что делает с программой компилятор, чтобы получился исполняемый файл.
- Как вводить данные с клавиатуры и выводить их на экран, и какие данные поддерживаются C++.
- Управляющие конструкции языка.
- Что такое стандарт языка, и как нас это касается.
- Обзор возможностей, встроенных в язык.
Обсудим следующие темы:
Как читать данные с клавиатуры и выводить их на экран.
Что происходит при вызове функции.
Операторы, порядок вычисления выражений. Особенности && и ||.
Обсудим основу объектно-ориентированной парадигмы — классы:
- Атрибуты и методы, уровни доступа. const и mutable
- Конструирование, копирование и разрушение объектов.
- Наследование и виртуальные методы. Абстрактные классы.
- Особенности определения операторов в виде методов класса.
Продолжим начатое неделю назад и обсудим следующие темы:
- Динамическое создание объектов.
- Наследование и виртуальные методы. Абстрактные классы.
- Особенности определения операторов в виде методов класса.
Обсудим следующие темы:
- Перегрузка функций и операторов.
- Шаблоны функций. Специализация.
- Пространства имён. Анонимные пространства имён.
Заканчиваем материал прошлого семинара
- Порядок конструирования
- правила вызовов virtual / const методов
- class / struct
https://github.com/ivafanas/cpp_shad_students/tree/master/2018/seminar4
Этот анонс написан пост-фактум.
Поговорили об особенностях видимости функций и глобальных переменных, завершили обсуждение пространств имён.
Обсудили умные указатели и парадигмы их использования.
Обсудим третий тип умных указателей, который не успели рассмотреть на предыдущей лекции.
Остальное время посвятим ответам на вопросы, накопившиеся за прошедшие лекции.
Вопросы принимаются всю неделю любым удобным для вас способом!
Обсудим механизм исключений:
- Что это такое, как устроено.
- Как бросать и как ловить.
- Стандартные и собственные классы исключений.
- Особые случаи: исключения в конструкторах и деструкторах.
- Гарантии при работе с исключениями: noexcept, строгая, базовая, никакая.
- Основы исключений
- Исключения и конструкторы / деструкторы
- best practices по работе с исключениями
https://github.com/ivafanas/cpp_shad_students/tree/master/2018/seminar6
Обсудим лямбда-функции:
- Контекст, захват и передача параметров.
- Определение возвращаемого типа.
- Использование mutable.
- Сохранение лямбда-функции как объекта.
Метапрограммирование — это программирование при помощи шаблонов, так что вычисления и проверки выполняются во время компиляции. Рассмотрим некоторые простые случаи:
- Вычисления на шаблонах. Рекурсивные шаблоны.
- Вычисление типа при помощи decltype.
- Type traits, std::is_same.
- Проверки времени компиляции (static_assert).
Обсудим некоторые вопросы, связанные с интернационализацией и локализацией программ.
- Суть проблемы, терминология.
- GNU gettext.
- Другие варианты решения.
- Кодировки, Unicode.
В заключительной лекции по курсу обсудим паттерны проектирования и особенности их реализации на языке C++.