spinner-it

Курс С++ (поглиблений)

Старт навчання
20.10.2021
51 год. по 2-3 рази на тиждень

Опис курсу

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

Мінімальні вимоги:

  • Володіння ПК
  • Знання основ теорії програмування
  • Основи С++
  • Наявність власного ноутбуку для занять в аудиторіях

Для опанування програми курсу вам знадобиться таке ПЗ:

 

1. Visual Studio Community — це спеціальна програма для розробки додатків і хмарних служб для різних платформ. Завантажити можна за посиланням.

 

2. Qt Creator — ще одна платформа для кросплатформної розробки продуктів на С, С ++ і QML. Завантажити можна за посиланням.

 

3. Git. Програма дозволяє зберігати ваш код локально і на сайті, а також керувати ним. Реєстрація за посиланням.

 

4. Wireshark — популярна програма аналізу трафіку, з якою будемо працювати на курсі. Завантажити можна за посиланням


* Примітка: зазначені знижки не сумуються з іншими діючими акціями та спеціальними пропозиціями. Знижка застосовується тільки до нових заявок та при умові повної оплати курсу. Якщо у Вас виникли питання, звертайтеся за консультацією до наших менеджерів!