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

Минимальные требования:

  • Наличие собственного ноутбука для занятий в аудиториях
  • Знание основ программирования
  • Основы С++

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