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

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

Описание

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


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

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


Требования к оформлению репозитория
Требования к домашним заданиям

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

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

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

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

Введение

Вступительная лекция. Познакомимся, обсудим организационные вопросы, а потом изучим (большинство слушателей, скорее, вспомнят) базовый объём знаний, необходимый для программирования на C++:

  • Как выглядит программа на C++, что она обязательно должна содержать.
  • Что делает с программой компилятор, чтобы получился исполняемый файл.
  • Как вводить данные с клавиатуры и выводить их на экран, и какие данные поддерживаются C++.
  • Управляющие конструкции языка.
  • Что такое стандарт языка, и как нас это касается.
  • Обзор возможностей, встроенных в язык.
Ввод и вывод. Функции и операторы

Обсудим следующие темы:

  • Как читать данные с клавиатуры и выводить их на экран.

  • Что происходит при вызове функции.

  • Операторы, порядок вычисления выражений. Особенности && и ||.

Классы

Обсудим основу объектно-ориентированной парадигмы — классы:

  • Атрибуты и методы, уровни доступа. const и mutable
  • Конструирование, копирование и разрушение объектов.
  • Наследование и виртуальные методы. Абстрактные классы.
  • Особенности определения операторов в виде методов класса.
Классы — продолжение

Продолжим начатое неделю назад и обсудим следующие темы:

  • Динамическое создание объектов.
  • Наследование и виртуальные методы. Абстрактные классы.
  • Особенности определения операторов в виде методов класса.
Перегрузка функций и операторов. Шаблоны

Обсудим следующие темы:

  • Перегрузка функций и операторов.
  • Шаблоны функций. Специализация.
  • Пространства имён. Анонимные пространства имён.
Семинар 4. Классы. Продолжение

Заканчиваем материал прошлого семинара

  • Порядок конструирования
  • правила вызовов virtual / const методов
  • class / struct

https://github.com/ivafanas/cpp_shad_students/tree/master/2018/seminar4

Анонимные пространства имён. Умные указатели

Этот анонс написан пост-фактум.

Поговорили об особенностях видимости функций и глобальных переменных, завершили обсуждение пространств имён.

Обсудили умные указатели и парадигмы их использования.

Умные указатели (окончание). Ответы на вопросы

Обсудим третий тип умных указателей, который не успели рассмотреть на предыдущей лекции.

Остальное время посвятим ответам на вопросы, накопившиеся за прошедшие лекции.

Вопросы принимаются всю неделю любым удобным для вас способом!

Исключения

Обсудим механизм исключений:

  • Что это такое, как устроено.
  • Как бросать и как ловить.
  • Стандартные и собственные классы исключений.
  • Особые случаи: исключения в конструкторах и деструкторах.
  • Гарантии при работе с исключениями: noexcept, строгая, базовая, никакая.
Семинар 6. Исключения
  • Основы исключений
  • Исключения и конструкторы / деструкторы
  • 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++.