Опис курсу
Основний курс навчання С++ допоможе Вам вдосконалити навички об’єктно-орієнтованого програмування. Ви навчитеся працювати зі стандартною бібліотекою 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
- Можливі проблеми при роботі в багатопоточному коді
- Що таке об’єкти синхронізації в багатопоточному коді? Важливість їхнього застосування
- 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