spinner-it

Поглиблений курс С++

Старт навчання
Старт курсу запитуйте в адміністрації
51 год. Тривалість заняття - 3 год
З 18:30 (19:00)
Двічі на тиждень

Опис курсу:

Курс допоможе вдосконалити навички об’єктно-орієнтованого програмування. Ви навчитеся працювати зі стандартною бібліотекою C++, оволодієте основними можливостями бібліотеки Qt, отримаєте практичний досвід розробки GUI-додатків. Ви дізнаєтеся про контейнери, алгоритми та адаптери, розберетеся в архітектурі додатків і базах даних, попрацюєте з багатопоточністю і модульним тестуванням. Курс складається з 12 занять загальною тривалістю 36 академічних годин. З них 12 годин піде на розгляд теоретичного матеріалу, інше – на практичну роботу.

Після вивчення курсу Ви зможете:

  • Удосконалити навички об'єктно-орієнтованого програмування, аналізу і проектування.
  • Працювати зі стандартною бібліотекою С++ бібліотекою Qt.
  • Розробляти GUI-програми.
  • Претендувати на високооплачувану роботу.

Програма курсу:

  • Конструктори/деструктори
  1. Правила генерації конструкторів до С++ 11.
  2. Що таке rvalue-посилання.
  3. Переміщуючий конструктор і переміщуючий оператор присвоєння.
  4. Правила генерації конструкторів і операторів присвоювання після С++ 11. 
  5. Функція std :: move. Неправильне застосування функції std :: move як значення, що повертається.
  6. Різниця між оголошенням конструкторів і операторів присвоювання як приватні методи і оголошення їх за допомогою ключового слова delete.
  7. Навіщо взагалі потрібно писати конструктори і оператори присвоювання як недоступні.
  8. Важливість оголошення конструкторів за допомогою ключового слова default.
  9. Що таке delegating constructors.
  10. Просте розуміння що таке NRVO і RVO. 
  11. Проблеми впливу призначеного для користувача конструктора на неявне перетворення типів. Ключове слово explicit.
  12. Reference-qualified методи класу.
 
  • Статичний поліморфізм
  1. Більш детальне розуміння перевантаження функції. Ключове поняття mangling та розгляд прикладу перевантаження на прикладі таблиці символів.
  2. Шаблони і шаблони класу. Правила виведення типів для шаблонних параметрів. Trailing return type.
  3. Проблематика шаблонів. Проблеми інстанціювання. Способи явного інстанціювання.
  4. Приклад написання класу array, як аналог заміни вбудованого статичного масиву.
 
  • Динамічний поліморфізм
  1. Особливості роботи з динамічним поліморфізмом (virtual functions).
  2. Важливі нововведення, починаючи з С++ 11, для безпечної роботи з динамічним поліморфізмом.
  3. Ключове слово final в контексті віртуальних функцій.
  4. Аргумент за замовчуванням і які проблеми він приховує в контексті віртуальних функцій.
  5. Структура type_info.
  6. Коли саме корисний динамічний поліморфізм.
 
  • Більш складні застосування шаблонів
  1. Структура std :: enable_if, навіщо це може стати в нагоді. Елегантна заміна складності std :: enable_if починаючи з С++ 17. 
  2. Метапрограмування, розгляд заголовку <type_traits> як способу отримання метаінформації про тип і застосування його на прикладі простого шаблону.
  3. Функція std :: forward.
  4. Шаблони зі змінним числом параметрів, поняття згортки.
  5. Шаблонні конструктори.
  6. Допоміжні шаблони std :: pair, шаблон std :: tuple. Які вони вирішують проблеми.
 
  • Написання бібліотек на мові С ++
  1. Що таке колективні бібліотеки.
  2. Що таке статичні бібліотеки.
  3. Різниця в написанні статичних і динамічних бібліотек.
  4. Приклад написання двох видів бібліотек.
  5. Написання С++-бібліотеки для підключення її в С-код і С++-код.
  6. Можливі проблеми при написанні бібліотек.
  7. Роздільна компіляція (багатомодульність) і лінкування.
 
  • Висновок типу в С++ (type deduction)
  1. Висновок типу за допомогою ключового слова auto, чи такий тип насправді?
  2. Ключове слово decltype.
  3. Константні посилання як засіб пролонгації часу життя об'єкта підводні камені.
 
  • Виняткові ситуації.
  1. Просте розуміння виняткових ситуацій. Що таке розкрутка стеку.
  2. Ключове слово noexcept. Його особливості.
  3. Висячі посилання і висячі покажчики.
  4. Виняткові ситуації в конструкторі і деструкторі.
  5. noexcept деструктори і конструктори.
  6. Чи потрібні виняткові ситуації. Що таке обробка помилок в стилі С, чи потрібна вона та які її переваги в порівнянні з винятковими ситуаціями.
 
  •  Розумні покажчики
  1. Патерн проектування RAII.
  2. Проблеми при використанні С-підходу динамічного виділення пам'яті для об'єктів.
  3. Що таке менеджер пам'яті і просте розуміння виділення пам'яті.
  4. Види розумних покажчиків. Яку проблему вони вирішують.
  5. Навіщо потрібні допоміжні функції (make_unique і т.д.). Яку проблематику вони вирішують.
  6. Чи завжди варто застосовувати розумні покажчики, можливі проблеми продуктивності.
  7. std :: static_pointer_cast, std :: dynamic_pointer_cast. У чому їхня відмінність від static_cast і dynamic_cast.
  8. Чи варто перевіряти створені розумні покажчики на nullptr. Коли розумні покажчики кидають виключення, а коли повертають nullptr.
 
  • Введення в STL
  1. Що таке STL.
  2. Трохи про структуру STL.
  3. Чи варто знати всю бібліотеку STL.
 
  • Контейнери в бібліотеці STL
  1. Послідовні контейнери. Види послідовних контейнерів, їхня відмінність. Особливості роботи з кожним із контейнерів. Розгляд основного функціоналу послідовних контейнерів. 
  2. Асоціативні контейнери. Види асоціативних контейнерів, їхні основні відмінності. Особливості роботи. Розгляд основного функціоналу асоціативних контейнерів. 
  3. Які завдання вирішують послідовні контейнери і асоціативні контейнери.
  4. У яких випадках не варто застосовувати контейнери. Накладні витрати на застосування контейнерів.
  5. Можливі підводні камені роботи як з послідовними, так і з асоціативними контейнерами.
  6. Класи адаптери контейнерів. Види та їх особливості.
  7. Що таке аллокатор як параметр контейнеру. Коли варто писати свій аллокатор, а коли ні.
 
  • Клас std :: string
  1. Розгляд основних можливостей класу std :: string. Помилки при створенні та ініціалізації класу std :: string.
  2. Розгляду основних методів роботи з класом std :: string. 
 
  • Ітератори
  1. Види ітераторів.
  2. Застосування ітераторів для кожного виду контейнеру.
  3. Спосіб роботи з ітераторами.
  4. Допоміжні функції для роботи з ітераторами.
  5. Що означає begin-ітератор і end-ітератор.
  6. Range for C++ як елегантний спосіб обходу контейнерів.
 
  • Алгоритми STL
  1. Види алгоритмів.
  2. Розгляд найчастіше використовуваних алгоритмів.
  3. Ітератори як клей між контейнером і алгоритмом.
  4. Чи всі види алгоритмів застосовні до всіх типів контейнерів. Що потрібно розуміти в інтерфейсі алгоритму.
  5. Переваги застосування методів контейнерів над алгоритмами.
  6. Переваги застосування алгоритмів над методами контейнерів.
 
  • Компаратор
  1. Що таке компаратор і його специфіка застосування в алгоритмах і деяких контейнерах.
  2. Що таке покажчик на функцію.
  3. Що таке функціональний об'єкт.
  4. Опис функції std :: bind.
  5. Що таке лямбда, що спільного між функціональним об'єктом. Що таке список захоплення і навіщо він потрібен. Особливості захоплення змінних. Ключове слово mutable і його застосування до захопленим параметрам лямбда. Як передати лямбду в С-функцію. Відмінність лямбда в С++ 11 і C++ 14.
  6. Спосіб генерації лямбда-функції. Типові помилки в написанні лямбда.
  7. Клас std :: function.
 
  • Процеси і потоки
  1. Що таке процес. Опис роботи процесу, виділення пам'яті і пов'язані з ним витрати.
  2. Що таке потік. Проблеми пов'язані з багатопоточністю.
  3. Що таке планувальник.
 
  • Потоки в С ++
  1. std :: thread і способи роботи. Передача параметрів в потоки. Проблеми пов'язані з класом std :: thread. Що таке join і detach.
  2. Що таке асинхронне виконання потоку і синхронне виконання.
  3. std :: async які його переваги в порівнянні з std :: thread. Параметри при створенні std :: async.
  4. Що таке std :: future.
  5. Що таке колективні дані. Чи варто використовувати підхід «поділ даних».
  6. Помилкове розуміння volatile-змінних в контексті потоків. Що таке бар'єри пам'яті. Клас std :: atomic, для чого він потрібен, пов'язані з ним накладні витрати. 
  7. Помилкове розуміння std :: shared_ptr в багатопотоковому програмуванні. 
  8. Що таке race condition і data race, причини їх отримання. 
  9. Об'єкти синхронізації потоків, доступних в стандартній бібліотеці.
  10. Що таке дедлок і механізми вирішення його в стандартній бібліотеці.
  11. std :: promise: що це таке. Його застосування в контексті багатопоточності. std :: future + std :: promise vs conditional variable.
  12. Виняткові ситуації в потоках.
  13. Що таке пул потоків і які він вирішує проблеми.
 
  • Мережеве програмування
  1. Що таке мережеве програмування.
  2. Види часто використовуваних протоколів. Що таке TCP і UDP протоколи. Коли їх варто застосовувати.
  3. Що таке сокети, їх види та застосування.
  4. Що таке міжпроцесорна взаємодії (IPC). Навіщо потрібна міжпроцесорна взаємодія. Які вона вирішує проблеми. Розгляд часто використовуваних підходів IPC.
 
  •  Введення в Qt
  1. Meta object compiler.
  2. Сигнали і слоти.
  3. QObject.
  4. Базова робота з віджетами.
  5. Event loop.
  6. Структура фреймворку.
 
  • Введення в QML
  1. Структура QML компонентів.
  2. Компоненти QtObject, Item.
  3. Базові графічні компоненти.
  4. Best practices в QML.
  5. Взаємодія C ++ & QML.
  6. - Q_PROPERTY.
  7. - Q_INVOKABLE.
  8. Компоненти ListView, GridView.
  9. Кастомізація компонентів.
  10. Attached properties.
  11. Scalability-додатки.
  12. Сигнали/Cлот в QML.
  13. Властивості, аліаси.
  14. Реєстрація своїх класів в метасистемі.
 
  •  Model View в Qt
  1. Поняття моделі, їхні види.
  2. Поняття делегату.
  3. Поняття ролі.
  4. Поняття view, їхні види.
  5. Реалізація своєї моделі, її реєстрація, базові методи QAbstractListModel.
  6. Створення кастомних компонентів-делегатів з використанням ролей.
  7. qmldir, розбивка програми на модулі.
  8. Використання стилів в QML.
  9. QVariant.
 
  • Робота з базами даних в Qt
  1. Підключення до бази даних.
  2. Класи QDir, QStandardPaths.
  3. Виконання SQL-запитів.
  4. Створення SQL-таблиць.
  5. Обробка помилок.
  6. Прив'язка значень.
  7. QVariantList.
  8. Qt контейнери, їхні переваги та недоліки.
  9. Copy-on-write.
  10. Java style iterators vs stl style iterators.
 
  • Багатопоточність в Qt
  1. Порівняння C++-потоків і багатопоточності в Qt.
  2. Багатопоточність на сигналах і слотах.
  3. QEventLoop.
  4. QThread.
  5. QtConcurrent.

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

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

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