Курс C++ (продвинутый)
Описание курса
Продвинутый курс C++ поможет усовершенствовать навыки ООП. Вы научитесь работать со стандартной библиотекой C++, освоите основные возможности библиотеки Qt, получите практический опыт разработки GUI-приложений.
—
Мы обучим вас приемам разработки ПО, решениям типичных задач программирования и разработки GUI-приложений на языке С++ с помощью библиотеки Qt.
—
Вы узнаете о контейнерах, алгоритмах и адаптерах, разберетесь в архитектуре приложений и базах данных, поработаете с многопоточностью и модульным тестированием ПО.
После курса вы сможете:
- Усовершенствуете навыки объектно-оринтованого программирования, анализа и проектирования
- Работать с стандартной библиотекой Qt языка С++
- Разрабатывать GUI программы
- Претендовать на получение серьёзной высокооплачиваемой работы
Программа курса:
1. Move семантика
- Что такое move семантика и какую ключевую роль она играет в современном С++?
- Что такое rvalue ссылка?
- Что такое value category и какие категории существуют в языке С++ (lvalue, prvalue т. д.)?
- Конструктор перемещения
- Оператор перемещения
- Сравнение производительности между классом, реализующим только копирующее поведение, и классом, реализующим перемещающее поведение
- std::move
- Советы о том, когда стоит корректно применять перемещающие операции (когда move семантика не помогает?)
2. Конструкторы и деструкторы
- Правило вызовов конструкторов, операторов присвоения базового класса
- Правило 3-х до С++11
- Правило 0 или правило 5-ти после С++11
- Правила генерации конструкторов и операторов при разных полях
- Когда стоит писать класс, который поддерживает только копирующее поведение, а когда только перемещающее?
- Ключевое слово default для конструкторов и операторов, важность его написания в отличие от явного определения тела конструктора
- Ключевое слово delete при объявлении конструкторов, операторов и деструкторов
- Проблемы влияния пользовательского конструктора на неявное преобразование типов. Ключевое слово explicit
- Ключевое слово using при наследовании
- Разница между объявлением конструкторов и операторов присваивания (как приватные методы) и объявлением их с помощью ключевого слова delete
- Что такое delegating constructors?
- Reference-qualified методы класса
- Ошибочное применение move семантики при наследовании
- Copy elision, RVO NRVO
3. Оптимизация
- Этапы компиляции
- Оптимизация компилятора (inline, const)
- Шаблоны как часть оптимизации на этапе компиляции
- constexpr и его важность в каждом стандарте С++
4. Вывод типа в С++ (type deduction)
- Вывод типа с помощью ключевого слова auto: таков ли тип на самом деле?
- Ключевое слово decltype
5. Шаблоны
- Ключевое слово typename в шаблонах и его важность
- Type traits свойства типа, выделение наиболее важных и рассмотрение их на примерах
- SFIANE. Применение std::enable_if и зачем его можно использовать в коде?
- std::enable_if как способ реализации частичной специализации для шаблонов функций
- if constexprt как возможность элегантной замены сложных конструкций std::enable_if
- Variadic template vs Fold expression
- Универсальные ссылки
- Perfect forwarding, важность функции std::forward
- Шаблонные методы и их отличие от шаблонного класса
6. Динамический полиморфизм
- Особенности работы с динамическим полиморфизмом (virtual functions)
- Аргумент по умолчанию, какие он скрывает проблемы в контексте?
- static_cast vs dynamic_cast
- RTTI, структура type_info
- Пример динамического полиморфизма на одном из паттернов проектирования
- Virtual destructor для избегания memory leaks
7. Лямбды
- Указатель на функцию
- Функтор
- Лямбда, список захвата
- Применение auto в аргументах лямбды
- Ключевое слово mutable и зачем его необходимо объявить в сигнатуре лямбды?
8. Умные указатели
- new vs malloc
- RAII
- std::unique_ptr vs std::shared_ptr. Move vs Copy
- Вспомогательные функции (make_unique и т. д.).
- Пользовательские deleter объекты как аргументы std::unique_ptr и std::shared_ptr. decltype как вывод сигнатуры функции
- Советы по корректному написанию custom deleter для unique_ptr
- Control block в std::shared_ptr. Зачем он нужен, какие он решает задачи, и каковы возможные подводные камни при выделении ресурса с помощью std::make_shared?
- std::weak_ptr, его применение и влияние на блок управления в std::shared_ptr
- Выделение динамического массива с помощью std::unique_ptr и std::shared_ptr. Специализация
- Производительность std::unique_ptr и std::shared_ptr
- std::static_pointer_cast, std::dynamic_pointer_cast. В чем их отличие от static_cast и dynamic_cast?
9. Исключительные ситуации
- Исключительные ситуации. Их важное применение
- Исключительные ситуации vs код возврата ошибки. Когда полезно применять код возврата ошибки?
- Блоки try catch
- throw как генерация исключения
- Класс std::exception. Виртуальный метод what
- Порядок написания блоков catch
- Что такое раскрутка стека при генерации исключения? Что будет, если при генерации исключения не будет найден подходящий блок catch?
- Что такое инвариантность при генерации исключения в конструкторе? Пример при написании operator =
- Smart pointers как способ избежать утечки ресурсов при генерации исключения
- Исключение не должно покидать деструктор
- Ключевое слово noexcept
- Оптимизация при написании функций как noexcept. Важность написания перемещающего конструктора как noexcept (на примере std::vector). Почему std::vector выбирает при реалокации копирующее поведение как дефолтное вместо перемещающей семантики (правило инвариантности)?
- Компиляция кода с флагом -fno-exceptions, возможные опасности
- new(std::nothrow) как способ использования оператора new, который не кидает исключения
10. Пространства имен
- Что такое пространства имен и какие проблемы они решают в большом коде?
- Inline namespace (provide library version)
- Вложенные пространства имен
- Using-directive, Using-declaration
- ADL (argument dependent lookup), правила поиска имен
11. Потоки в С++
- Основы мультипоточности
- concurrency vs parallelism
- std::thread. Что такое join и detach, и зачем их стоит вызывать?
- Передача параметров в потоки и возможные подводные камни
- Возвращаемое значение с потока при работе с std::thread. std::future and std::promise
- Исключительные ситуации в потоках
- std::async vs std::thread. Особенность std::future в std::async
- Понятия data race, race conditions. Возможные проблемы при работе в многопоточном коде
- Что такое объекты синхронизации в многопоточном коде? Важность их применения
- strong memory model vs weak memory model
- std::mutex. Почему std::mutex – это иногда плохо?
- Важность RAII подхода при работе с std::mutex
- std::recursive_mutex. Read-write mutex (std::shared_mutex)
- Thread-safe variable Initialisation. std::call_once. Способы написания потокобезопасного singleton. Подводные камни с применением static initialization
- std::condition_variable. Что такое spears wakeup и lost wakeup?
- strong memory model vs weak memory model
- Std::atomic
- Ошибочное понимание std::shared_ptr в многопоточном программировании
- Volatile – это не механизм синхронизации потока
12. Библиотека STL
- Что такое библиотека STL? Что она позволяет решать в повседневном программировании?
- Контейнеры в STL. Их структура, особенности, и какие они решают задачи
- Итераторы. Что это? Зачем они нужны? Их свойства. Пример написания своего итератора
- Что такое компараторы? std::bind
- Алгоритмы. Важность итераторов при работе с алгоритмами. Рассмотрение категорий алгоритмов
- Псевдоконтейнеры
- STL – это не только контейнеры-итераторы-алгоритмы
13. Опциональные темы. Т. е. выбор темы: или сетевое программирование с обзором библиотеки boost, или QT
14. Сетевое программирование и библиотека boost.asio
- Network model osi layers
- Понятие IPC (inter process communication)
- Что такое клиент-сервер?
- Что такое протоколы обмена данными?
- Что такое socket, endpoint?
- TCP протокол, реализация TCP клиента и сервера
- UDP протокол, реализация UDP клиента и сервера
- Написание pool thread в примере при работе с TCP сервером
- Форматы обмена данными (json и т. д.)
- GRPC. protobuf. Понятие сериализации и десериализации данными
15. Обзор библиотеки boost. QT
- Meta object compiler
- Сигналы и слоты
- QObject
- Базовая работа с виджетами
- Event loop
- Структура QML-компонентов
- Базовые графические компоненты
- Взаимодействие C++ & QML
- Кастомизация компонентов
- Компоненты ListView, GridView
- Сигналы/слоты в QML
- Регистрация своих классов в метасистеме
- Понятие модели, их виды
- Понятие делегата
- Понятие роли
- Реализация своей модели, её регистрация, базовые методы
- QAbstractListModel
- Многопоточность в Qt
Минимальные требования:
- Наличие собственного ноутбука для занятий в аудиториях
- Знание основ программирования
- Основы С++
Для освоения программы вам понадобится такое ПО:
1. Visual Studio Community — это специальная программа для разработки приложений и облачных служб для различных платформ. Скачать можно по ссылке
2. Wireshark — популярная программа анализа трафика, с которой будем работать на курсе. Скачать можно по ссылке
3. Qt Creator — еще одна платформа для кроссплатформенной разработки продуктов на С, С++ и QML. Скачать можно по ссылке
4. Git. Программа позволяет хранить ваш код локально и на сайте, а также управлять им. Регистрация по ссылке
* Примечание: указанные скидки не суммируются с другими действующими акциями и специальными предложениями. Скидка применяется только к новым заявкам и при условии полной оплаты. Если у Вас возникли вопросы, обращайтесь за консультацией к нашим менеджерам!