Профессиональное программирование на C++

Информация о курсе:
Длительность курса: 3 месяца (67,5 часов)
Субботние группы: 15 занятий х 4,5 часа
Дата начала курса:
23 февраля 15:00-19:30
(занятия проходят по субботам)
Если вы уже изучали язык программирования C++ в университете, коммерческих учебных заведениях, на онлайн-курсах или самостоятельно, ознакомьтесь с программой курса «Основы программирования на C++» и убедитесь, что вы владеете 70-100% учебного материала. В этом случае рекомендуем вам продолжить обучение на курсе «Профессиональное программирование на С++». Если же у вас возникают какие-то сомнения, звоните, наши тренеры помогут вам сориентироваться при выборе необходимого курса.
Указатели на функции:
- Адаптирование интерфейсов, callback функции, typedef.
- Как при добавлении новых полей в структуру (или при наследовании от нее) добавить возможность сортировки этих структур по этим новым полям без перекомпиляции алгоритма сортировки. (то есть, как не создавать себе в будущем лишнюю работу). Предикативные функции.
- Как использовать уже имеющийся чужой алгоритм (интерфейс) для обработки своих типов данных.
Шаблонные функции:
- Правила определения параметров типов, возможность приведения типа, перегрузка.
Функции с неопределенным количеством параметров:
- Зачем нужен первый параметр, работа с разнотипными параметрами.
Классы:
- Правило инициализации членов класса, функциональности по умолчанию и их запрет, конструкторы, деструкторы, ресурсы и принцип работы с ними, как объект может идентифицировать себя среди других - this. public, private, наличие в классе объектов другого класса или указателей, время жизни взаимодействующих объектов, композиция - осведомленность и агрегирование.
Друзья класса:
- Как функции или классу стать другом другого класса.
- Взаимоотношения между классами-друзьями, предварительное объявление.
- Как избежать перекрестных ссылок и неоднократного объявления типов, директивы #ifndef, #pragma.
Конструктор копирования:
- Всегда ли он нужен, мелкое и глубокое копирование, как копировать объект внутри которого есть объект другого класса.
- Вызов конструкторов, деструктора, перегрузка.
Перегрузка операторов +, =, <<, (type cast), ->, *(разименование), new, ++, !=, [ ], функтор):
- Правила перегрузки. Использование в шаблонах. Диагностика.
Константность в классах, const_cast, mutable:
- Что такое настоящая константа и readonly field. volatile (потоки и оптимизация компилятора).
- Нужно ли менять константу и как работать с константными объектами.
Статические члены класса, private конструктор, паттерн Singleton:
- Как запретить создание объекта на стеке, подсчет объектов данного класса, что делать если объект какого-то класса в программе должен быть только один.
Наследование:
- Отличие между расширением функционала и наследованием интерфейса.
- Как инициализируется объект наследника.
- Работа из под указателя на базовый класс. protected члены класса и private, protected наследование.
Полиморфизм:
- Виртуальные функции, деструктор, абстрактный базовый класс, интерфейс, vptr, vtbl, раннее и позднее связывание, механика вызова виртуальной функции. dynamic_cast, typeid, RTTI. В каких случаях виртуальный деструктор не спасет.
- Что такое ABI (Application Binary Interface). Выравнивание данных (alignment).
Паттерны проектирования:
- Реализация и использование паттернов: Bridge, Abstract Factory, Visitor, Observer, Decorator, Chain Of Responsibility, MVC, Singleton, Adapter, Builder.
Шаблонные классы:
- hpp файлы, конструктора копирования на основе других параметров типа.
- Специализация шаблонов.
Динамические структуры данных:
- Связные списки, деревья, очереди, стек, написание своего класса Tree.
STL:
- Создание своего класса List, поддерживающего интерфейс STL(итераторы, операторы, функции-члены).
- Контейнеры: std::vector, list, deque, map, set. Работа с итераторами при изменении размера вектора. std::vector с указателями на объекты. hash, сравнение алгоритмов (Big O Notation).
- Алгоритмы: find, copy, find_if, remove, equal_to, bind2nd и т.д.
- Пространства имен.
BOOST:
- Знакомство с BOOST (как его скомпилировать и настроить проект), boost::bind, вся библиотека smart_ptr.
Обработка исключительных ситуаций:
- Архитектура программы, использующей исключения.
- Переброс исключений, catch(...), catch(BaseЕхсeptionClass &), правила размотки стека, время жизни выбрасываемого объекта исключения.
Умные указатели:
- std:: и boost:: shared_ptr, weak_ptr, make_shared, auto_ptr, std::unique_ptr.
С++ 11:
- Знакомство с IDE QtCreator. лямбды, ссылка на rvalue и movable конструктор (а также копирование, присваивание), auto, noexcept, std::thread, std::lock_guad, std::move()
Множественное наследование:
Динамические и статические библиотеки (Windows/Linux):
- Подключение в проект, командная строка gcc (g++) компилятора. .dll, .lib, .so, .a, явное и неявное связывание, экспорт функций, классов, экcпорт интерфейса (абстрактного класса), debug.
- Правила написания кроссплатформенного приложения.
GUI - оконные приложения на примере Win32 API или Qt:
- Вечный цикл, сообщения, оконная процедура, Send-PostMessage и их отличия.
- Работа с элементами управления: BUTTONs (radio, check, groupbox), СOMBOBOX, EDIT и т.д. Что такое события и слоты (в частности в Qt) замена оконной процедуры, перемещение точки начала прорисовки, создание своего элемента управления, OWNERDRAW.
Процессы, потоки (Windows/Linux/С++11):
- Адресное пространство, синхронизация на примере Win32, std:: .
- Cписок процессов, мьютексы, семафоры, события, ожидаемые таймеры, обмен данными между процессами, TLS, condition_variable, lock_quard, unique_lock.
Создание сетевого приложения (Windows/Linux)*:
- Cокеты, протоколы (TCP, UDP), блокирующие и неблокирующие режимы.
Работа с базами данных*:
- Cоздание базы, таблицы, запросы - многотабличные, вложенные, функции агрегирования, внешние ключи, хранимые процедуры.
Дипломный проект: Создание плагина, позволяющего добавить новую функциональность в уже имеющуюся программу. Программа поддерживает кроссплатформенность на уровне исходников - вся работа с ресурсами («железом») выделена в отдельные заменяемые блоки, специфичными для конкретной платформы.
