Обучение языку C++, часть 1
Санкт-Петербург, осень 2015
Описание
Это курс является базовым курсом по программированию — для его освоения не требуется никаких специальных знаний, кроме владения синтаксисом хотя бы одного из “стандартных” структурных языков программирования таких как (C, Pascal, Fortran, Java и т.п.). В первой части курса будут разобраны базовые возможности C++: программирование с использованием структур и функций (структурное программирование), объектно-ориентированное программирование и основы программирования с использованием шаблонов (обобщённое программирование). Кроме этого в на примере C++ будет довольно подробно рассказано о том, как происходит компиляции и выполнение программ.
Во второй части курса будут рассмотрены “продвинутые” возможности C++, такие как стандартная библиотека, исключения и метапрограммирование, а также мы достаточно много времени уделим возможностям C++, которые появились в стандарте 2011 года.
Отчётность по курсу: оценка по курсу выставляется по результатам сданных домашних заданий и результатам сдачи онлайн-курса. В семестр планируется всего три домашние задания, но они будут довольно объёмными. При сдаче домашнего задания проверяется не только работоспособность кода, но и его качество.
Программа первой части курса будет очень близка к программе одноименного онлайн-курса, однако на лекциях Вы сможете получить больше информации и задать вопросы.
Лекции: В сентябре лекций не будет. Очные занятия начнутся со второй недели октября. В сентябре студентам предлагается прослушать онлайн-курс. В дальнейшем повествование будет вестись параллельно с онлайн-курсом.
Планируется проводить видеозапись лекций.
Преподаватели
Список лекций
Идея расширения типа. Наследование. Неявное приведение типов. protected. Ещё раз о перегрузке. Переопределение методов. Виртуальные методы. Таблица виртуальных методов. Виртуальные методы в конструкторе и деструкторе.
Рассказ об основных идеях ООП. Различия между наследованием и агрегированием. Особенности наследования в C++. Ключевое слово friend.
Перегрузка операторов. Какие операторы можно перегружать. Стандартная семантика операторов. Важно помнить о приоритете операций. Как правильно реализовывать + через +=. Перегрузка &&, ||, ‘,’ . Перегрузка [] и ().
Ключевое слово inline. Вопросы производительности. Статические ``глобальные'' переменные. Статические локальные переменные. Статические функции. Статические члены класса. Необходимость инстанциации статических полей. Code conventions.
Шаблоны функций и классов. Вывод шаблонных параметров из аргументов функций. Шаблоны конструкторов и обычных методов. Компиляция шаблонов. Почему их нужно определять в заголовочных файлах. Аргументы шаблонов по умолчанию.
Специализация шаблонов. Отличие специализации от перегрузки. Частичная специализация шаблонов. Нетиповые шаблонные параметры. Использование зависимых имён (использование typename).
Концепция RAII. scoped_ptr, unique_ptr/auto_ptr, shared_ptr, intrusive_ptr, linked_ptr, weak_ptr.
Указатели на функции. Указатели на методы. Указатели на члены данных. Использование указателей на функции в качестве функторов. Пример использование указателей на методы - паттерн Listener.
Определение пространств имён. Глобальное пространство имён. Директивы using (2 формы). Поиск имён. Поиск Кёнига (ADL). Поиск имён при наследовании.