spinner-it

Курс C++ (продвинутый)

Старт обучения
Дату уточните у администрации
51 час. по 2-3 раза в неделю

Описание курса

Продвинутый курс 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. Программа позволяет хранить ваш код локально и на сайте, а также управлять им. Регистрация по ссылке

* Примечание: указанные скидки не суммируются с другими действующими акциями и специальными предложениями. Скидка применяется только к новым заявкам и при условии полной оплаты. Если у Вас возникли вопросы, обращайтесь за консультацией к нашим менеджерам!