Программирование на C++, часть 1

Санкт-Петербург, осень 2017

Описание

Это курс является базовым курсом по программированию — для его освоения не требуется никаких специальных знаний, кроме владения синтаксисом хотя бы одного из “стандартных” структурных языков программирования, таких как C, Pascal, Fortran, Java и т.п. В первой части курса будут разобраны базовые возможности C++: программирование с использованием структур и функций (структурное программирование), объектно-ориентированное программирование и основы программирования с использованием шаблонов (обобщённое программирование). Кроме этого, на примере C++ будет довольно подробно рассказано о том, как происходит компиляция и выполнение программ.

Во второй части курса будут рассмотрены “продвинутые” возможности C++, такие как стандартная библиотека, исключения и метапрограммирование, а также мы достаточно много времени уделим возможностям C++, которые появились в стандартах 2011 и 2014 годов.

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

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

Для сдачи курса нужно сдать как минимум две задачи и прорешать онлайн-курс. Тем, кто сдаст две задачи, будет поставлена оценка 4, тем, кто сдаст три, — оценка 5.

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

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

Языки С и С++

Краткая история C и C++. Эффективность программ на C++. Сложности программирования на C++. Превращение кода в программу: компиляция и линковка. Структура программы на C/C++: файлы кода и заголовочные файлы. Макросы для защиты от повторного включения заголовочного файла. Зависимости между частями программы.

Как работает программа

Во что превращается этот код в исполняемом файле. Структура исполняемой программы. Раздел кода, раздел данных. Использование памяти в работающей программе. Стек и куча. Как передаются параметры функции. Где оказываются переменные. Что происходит при линковке.

Указатели и ссылки

Передача параметра с помощью указателя. Взятие адреса переменной и, наоборот, значения по адресу. Неинициализированные указатели. Нулевой указатель. Массивы и указатели. Арифметика указателей. Потенциальные проблемы при использовании указателей. Ссылки. Сходство с ссылок с указателями и их отличия. Как хранятся ссылки. lvalue и rvalue.

Динамическая память

Язык C: malloc/calloc/realloc/free. Язык C++: new/ delete и new[]/ delete[]. Почему нужны 2 набора операторов. Потенциальные проблемы. Вопросы производительности. Двумерные массивы. Ввод-вывод в C и C++.

Структуры

Идея инкапсуляции. Конструктор и деструктор. Поля и методы. Определение класса в .hpp и в .cpp. Класс самоуправляющегося массива. Автоматический вызов деструктора. Об опасности неожиданного завершения программы. Ещё раз о различиях malloc/free и new/delete. Конструктор копирования. Проблемы с присваиванием объектов. Как запретить присваивание. Ограничение прав доступа к членам класса. Почему все поля должны быть private? Какие методы стоит делать public? Принцип ``всегда целого'' объекта. Placement new.

Инициализация и const

Потенциальная проблема: неинициализированные переменные. Возможности инициализации в конструкторе. Другая проблема — случайное изменение переменных. Решение: константные поля. Констатные методы. Константное возвращаемое значение. Заразность const. Идея возвращения значения по ссылке. Возможность создания парных методов const/не-const. Константность this. Ключевое слово mutable.

Наследование, перегрузка, переопределение

Идея расширения типа. Наследование. Неявное приведение типов. protected. Ещё раз о перегрузке. Переопределение методов. Виртуальные методы. Таблица виртуальных методов. Виртуальные методы в конструкторе и деструкторе.

Объектно-ориентированное программирование

Рассказ об основных идеях ООП. Различия между наследованием и агрегированием. Особенности наследования в C++. Ключевое слово friend.

Перегрузка операторов

Перегрузка операторов. Какие операторы можно перегружать. Стандартная семантика операторов. Важно помнить о приоритете операций. Как правильно реализовывать + через +=. Перегрузка &&, ||, ‘,’ . Перегрузка [] и ().

Ключевые слова static и inline

Ключевое слово inline. Вопросы производительности. Статические ``глобальные'' переменные. Статические локальные переменные. Статические функции. Статические члены класса. Необходимость инстанциации статических полей. Code conventions.

Указатели на функции и члены классов

Указатели на функции. Указатели на методы. Указатели на члены данных. Использование указателей на функции в качестве функторов. Пример использование указателей на методы — паттерн Listener.

Шаблоны. Часть 1. Умные указатели

Шаблоны функций и классов. Вывод шаблонных параметров из аргументов функций. Шаблоны конструкторов и обычных методов. Компиляция шаблонов. Почему их нужно определять в заголовочных файлах. Аргументы шаблонов по умолчанию.

Концепция RAII. scoped_ptr, unique_ptr/auto_ptr, shared_ptr, intrusive_ptr, linked_ptr, weak_ptr.

Шаблоны, часть 2

Специализация шаблонов. Отличие специализации от перегрузки. Частичная специализация шаблонов. Нетиповые шаблонные параметры. Использование зависимых имён (использование typename).