Обучение языку C++, часть 1

Новосибирск, осень 2017

Описание

Первая часть курса Программирование на C++ в Новосибирске.


Критерии оценки
Оценка Баллы
зачёт 14
хорошо 20
отлично 26

Максимум баллов за курс: 30


Материалы семинаров

https://github.com/ivafanas/cpp_shad_students


Требования к домашним заданиям

Проверьте, что:

  1. задание оформлено как отдельный приватный проект в gitlab.com
  2. семинарист ivafanas добавлен в проект как разработчик
  3. отослано письмо семинаристу на ivafanas(собачка)gmail.com
    • в заголовке письма указаны имя, фамилия, задание
    • в теле письма дана ссылка на проект в gitlab
  4. проект содержит файл README.md, со следующими пунктами:
    • о чём проект
    • инструкции сборки
    • инструкции по использованию
  5. тестирование
    • есть unit-тесты (разумное количество)
    • unit-тесты проходят (все)
    • если для сборки юнит-тестов нужен специальный ключ для cmake, он задокументирован в README
    • наличие интеграционных тестов не обязательно, но приветствуется
  6. поддержана система генерации проектов cmake
  7. список может пополниться по факту общения со студентами

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

Список лекций

Введение

Вступительная лекция. Познакомимся, обсудим организационные вопросы, а потом изучим (большинство слушателей, скорее, вспомнят) базовый объём знаний, необходимый для программирования на 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.
  • Другие варианты решения.