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

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

Описание

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

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

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

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

Осенью 2014 года видеозапись лекций курса не ведётся, по ссылке можно найти лекции 2011 года. Обратите внимание, что преподаватель сменился, поэтому прочтения могут существенно отличаться.

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

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

Языки С и С++

Краткая история 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

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

Умные указатели

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

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

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