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

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

Описание

Это курс является базовым курсом по программированию — для его освоения не требуется никаких специальных знаний, кроме владения синтаксисом хотя бы одного из “стандартных” структурных языков программирования таких как (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 набора операторов. Потенциальные проблемы. Вопросы производительности. Двумерные массивы.

Структуры

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

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

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

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

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

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

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

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

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

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

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

Шаблоны. Часть 1

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

Шаблоны, часть 2. Умные указатели

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

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

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

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