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

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

Описание

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

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

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

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

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

Планируется проводить видеозапись лекций.

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

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

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

Идея расширения типа. Наследование. Неявное приведение типов. 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.

Пространства имён

Определение пространств имён. Глобальное пространство имён. Директивы using (2 формы). Поиск имён. Поиск Кёнига (ADL). Поиск имён при наследовании.