1. Языки программирования С и С++.
Краткая история C и C++. Эффективность программ на C++. Сложности программирования на C++. Превращение кода в программу: компиляция и линковка. Структура программы на C/C++: файлы кода и заголовочные файлы. Макросы для защиты от повторного включения заголовочного файла. Зависимости между частями программы.
2. Принципы работы разработанного программного обеспечения.
Во что превращается программный код в исполняемом файле. Структура исполняемой программы. Раздел кода, раздел данных. Использование памяти в работающей программе. Стек и куча. Как передаются параметры функции. Где оказываются переменные. Что происходит при линковке.
3. Указатели и ссылки.
Передача параметра с помощью указателя. Взятие адреса переменной и, наоборот, значения по адресу. Неинициализированные указатели. Нулевой указатель. Массивы и указатели. Арифметика указателей. Потенциальные проблемы при использовании указателей. Ссылки. Сходство с ссылок с указателями и их отличия. Как хранятся ссылки. lvalue и rvalue.
4. Динамическая память
Язык C: malloc/calloc/realloc/free. Язык C++: new/ delete и new[]/ delete[]. Почему нужны 2 набора операторов. Потенциальные проблемы. Вопросы производительности. Двумерные массивы. Ввод-вывод в C и C++.
5. Структуры. Част 1.
Идея инкапсуляции. Конструктор и деструктор. Поля и методы. Определение класса в .hpp и в .cpp. Класс самоуправляющегося массива. Автоматический вызов деструктора. Об опасности неожиданного завершения программы.
6. Структуры. Част 2.
Различия между malloc/free и new/delete. Конструктор копирования. Проблемы с присваиванием объектов. Как запретить присваивание. Ограничение прав доступа к членам класса. Почему все поля должны быть private? Какие методы стоит делать public? Принцип ``всегда целого'' объекта. Placement new.
7. Инициализация и const.
Потенциальная проблема: неинициализированные переменные. Возможности инициализации в конструкторе. Другая проблема — случайное изменение переменных. Решение: константные поля. Констатные методы. Константное возвращаемое значение. Заразность const. Идея возвращения значения по ссылке. Возможность создания парных методов const/не-const. Константность this. Ключевое слово mutable.
8. Наследование, перегрузка, переопределение
Идея расширения типа. Наследование. Неявное приведение типов. protected. Ещё раз о перегрузке. Переопределение методов. Виртуальные методы. Таблица виртуальных методов. Виртуальные методы в конструкторе и деструкторе.
9. Объектно-ориентированное программирование.
Основные идеи ООП. Различия между наследованием и агрегированием. Особенности наследования в C++. Ключевое слово friend.
10. Перегрузка операторов.
Перегрузка операторов. Какие операторы можно перегружать. Стандартная семантика операторов. Приоритеты операций. Как правильно реализовывать + через +=. Перегрузка &&, ||, ‘,’ . Перегрузка [] и ().
11. Ключевые слова static и inline.
Ключевое слово inline. Вопросы производительности. Статические ``глобальные'' переменные. Статические локальные переменные. Статические функции. Статические члены класса. Необходимость инстанциации статических полей. Code conventions.
12. Указатели на функции и члены классов
Указатели на функции. Указатели на методы. Указатели на члены данных. Использование указателей на функции в качестве функторов. Пример использование указателей на методы — паттерн Listener.
13. Шаблоны. Часть 1. Умные указатели.
Шаблоны функций и классов. Вывод шаблонных параметров из аргументов функций. Шаблоны конструкторов и обычных методов. Компиляция шаблонов. Почему их нужно определять в заголовочных файлах. Аргументы шаблонов по умолчанию.
Концепция RAII. scoped_ptr, unique_ptr/auto_ptr, shared_ptr, intrusive_ptr, linked_ptr, weak_ptr.
14. Шаблоны. Часть 2.
Специализация шаблонов. Отличие специализации от перегрузки. Частичная специализация шаблонов. Нетиповые шаблонные параметры. Использование зависимых имён (использование typename).
Все указанные темы и их подразделы должны быть проиллюстрированы соответствующими синтаксическими конструкциями (примеры кодов) в формате общий шаблон и пример. Необходимо приводить примеры для основных понятий.
При подготовке доклада с презентацией нужно следовать следующим требованиям:
Для одной темы презентация должна содержать более 30 слайдов. Текст доклада, поясняющий слайды, может быть объемным и высылается отдельным файлом на предварительную проверку.
Длительность доклада одной темы порядка 60 минут, может быть несколько докладчиков (количество докладчиков зависит от объема темы).
На слайдах нужно показывать только определения, концепции и основные понятия нужно приводить тезисно.
Желательно на слайдах представлять рисунки, схемы и сравнительные таблицы, синтаксические конструкции (примеры кодов) в формате общий шаблон и пример.
Выберите, кто какую тему будет разрабатывать. Пришлите список бригад с ФИО участников.