C++ від новачка до експерта | seg.com.ua - Cybersecurity сервіси та навчання у Киеві

C++ від новачка до експерта

C++ — одна з найскладніших мов програмування, яка вимагатиме від вас терпіння, але ваші зусилля будуть компенсовані вашою затребуваність на професійному ринку. Ви зможете створювати топові продукти будь-якої складності, адже на C++ можна писати все: драйвери пристроїв, програми для пристроїв IoT, десктопні прикладні програми: ігри, бізнес-додатки, сервери для мережевих служб та багато іншого.
Ви навчитеся різним прийомам програмування C++, познайомитеся з принципами об'єктно-орієнтованої розробки, створення GUI-додатків мовою С++ за допомогою бібліотеки Qt. А ще ви дізнаєтеся все про контейнери, алгоритми і адаптери, розбиратиметеся в архітектурі додатків і модульному тестуванні ПЗ.

 

Цільова аудиторія курсу:

  • для новачків, що прагрнть розпочаит. кар'єру програміста
  • для тих хто вирішив зміними свою професію та зануритися до програмування
  • ви вже програміст та вирішили вивчити новий напрямок
  • ви вже програмуєте, але відчуваєте протребу у систематизації та оновленні Ваших знань

Що Ви будете вміти:

1. Використовувати основні структури даних для створення програм
2. Застосовувати принципи ООП розробки програм
3. Розробляти консольні програми в ОС Linux
4. Працювати зі стандартною бібліотекою С++ та бібліотекою Qt
5. Писати GUI-програми
6. Працювати як у команді, так і соло на фрілансі
7. Володіти тайм-менеджментом для ефективного планування та виконання завдань

Що буде:

  • Теорія та багато практики
  • Найновіші механіки роботи
  • Знання, що напрацьовані тренером у проді
  • Відповіді на ваші запитання

Що включено до програми курсу:

  1. 36 занять - мікс з теорії та практики
  2. Робота в груповому чаті з постійною присутністю модератора
  3. Матеріали курсу в електронному форматі
  4. Додаткові матеріали за темами курсу
  5. Сертифікат про проходження навчання від навчального центру

ПРОГРАМА КУРСУ

1. ТРОШКИ ІСТОРІЇ

● Низькорівневі мови (мова асемблера)
● Високорівневі мови
● Транслятори
● Компіляція
● Інтерпретація
● Парадигми програмування
● Історія С++

2. ЗМІННІ ТА ТИПИ ДАНИХ

● Що таке змінна. Синтаксис оголошення змінної
● Тип даних. Що таке жорстка типізація. Навіщо змінній потрібний тип даних
● Цілочисельний тип даних
● Символьні типи
● Починаючи з С++11, цілі типи з фіксованим розміром, які проблеми вони вирішують
● Що таке аліас на тип даних. Приклад з описом typedef.
● Розуміння типів size_t, time_t
● Логічний тип даних
● Речові типи даних. Можливі підводні камені уявлення у пам'яті
● Способи оголошення змінних. Ініціалізація змінних.
● Проблема неініціалізованих змінних
● Оператор sizeof для отримання розміру змінних та типів
● Способи ініціалізації змінних до С++11 та універсальна ініціалізація починаючи з С++11 як засіб вирішення проблем старої ініціалізації
● Автоматичний вихід типу. Ключове слово auto та decltype
● Константи
● Способи оголошення констант
● Що таке compile time та run time-вираз.

3. ОСНОВНІ ОПЕРАЦІЇ С++

● Види операторів (унарний, бінарний, тернарний). Їхній синтаксис
● Неявне перетворення оператора присвоєння. Що таке зрізання.
● Що таке перетворення, що звужує. Проблема знакового та беззнакового перетворення
● Явне перетворення типів (С++-підхід)
● Арифметичні операції
● Проблема арифметичних операцій.
● Змішані вирази. Пріоритет операцій
● Базові поняття Rvalue та Lvalue
● Складовий оператор
● Пост- та пре-інкремент та декремент. У чому відмінність між пре- та пост-операцією
● Оператори відносин між операндами. Можливе підводне каміння
● Логічні операції
● Бітові операції. Що таке установка біта, що таке скидання біта. Що таке little-endian та big-endian. Що таке бітові маски, приклад бітових масок до З +11 і починаючи з З +11
● Опис різниці між логічним порівнянням із застосуванням логічних операторів {|| &&} та бітовими операціями {| &}
● Арифметичні операції, застосовні до типу char та різниця з виведенням на потік символьного типу та цілісного типу

4. ОПЕРАТОРИ, КЕРУЮЧІ ХОДОМ ВИКОНАННЯ ПРОГРАМИ

● Умовний оператор if.
● Різні підходи з написанням оператора if для уникнення спагетті-коду
● Що таке область видимості. Що таке блок
● Оператор вибору switch. Проблема fall through. У чому різниця між оператором вибору switch та логічним оператором if
● Оператор циклу for. Методи оголошення циклу for. Навіщо потрібний вічний цикл. Можливі проблеми знакового та беззнакового порівняння та їх наслідки
● Оператор циклу while
● Оператор циклу do while. Використання do while для вирішення проблем з розгалуженням коду з використанням оператора if
● Тернарний оператор

5. МАСИВИ

● Що таке масив і в чому його переваги
● Оголошення масивів. Способи вказівки розміру масиву
● Ініціалізація масиву. Можливі помилки при ініціалізації масиву
● Масив змінної довжини як розширення компілятора. Прапор компіляції -pedantic
● Масив символів або рядків. Методи оголошення. Що таке нуль-термінальний знак. Можливі проблеми при ініціалізації символьного масиву
● Доступ до елементів масиву
● Що таке вихід за межі масиву. Що таке buffer overflow
● Цикли як спосіб обходу, обробки та виведення масиву на екран
● Розмір масиву. Як отримати кількість елементів масиву
● C++11 range for як спосіб зручної роботи з масивом. У чому відмінність range for та інших циклів та які проблеми вирішує range for на відміну від інших циклів
● Відмінність символьного масиву з інших типів масивів. Як правильно оминати символьний масив у циклах. Як вивести символьний масив на екран Як зчитувати символи введені з клавіатури в символьний масив та можливі проблеми
● Багатовимірні масиви. Приклади подання багатовимірного масиву одновимірним масивом

6. ВКАЗІВНИКИ

● Базові поняття пам'яті стек
● Що таке локальні змінні та як змінні створюються на стеку.
● Що таке автоматичне керування пам'яттю
● Базове поняття покажчика
● Оголошення вказівників
● Способи ініціалізації вказівника. Що таке невалідний вказівник?
● Що таке розіменування вказівника та можливі проблеми. nullptr як правильний літерал для ініціалізації вказівника. Що означає поняття «покажчик на тип». Розмір покажчика, моделі пам'яті різних ОС та платформ. Чому для вказівника правильний тип?
● Що таке константний вказівник та вказівник на const. Приклад можливих помилок
● Арифметика із вказівниками. Чим відрізняються арифметика із вказівниками від арифметики зі змінними
● Що спільного між масивом та вказівником. Як обходити масив за допомогою вказівника. Що означає вказівник на елемент за останнім елементом масиву та навіщо так робити

7. ФУНКЦІЇ

● Що таке функція та які вона вирішує проблеми у коді
● Синтаксис функції
● Базове поняття що таке оголошення та визначення функції. Приклад відмінності
● Що таке списки установок. Спосіб виклику функції. Встановлення стандартного значення для параметра
● Значення, що повертається з функції. auto як автоматичний висновок значення, що повертається. Проблеми під час автоматичного виведення типу.
● Тип void як маркер не повертається значення функції
● Надсилання параметрів за значенням
● Що таке фактичні та формальні параметри
● Неправильне використання auto як параметрів функції та подальше розширення компіляторів
● Що таке глобальні змінні. Проблема приховування імен глобальних та локальних змінних
● Передача за вказівником. Спосіб повернення кількох значень із функції
● Що таке посилання. У чому відмінність посилання від вказівника
● Посилання як частина інтерфейсу функції
● Які проблеми вирішує посилання порівняно з вказівником як параметр функції. Які переваги константного заслання. Чому можна передавати Rvalue як аргумент константного посилання
● Приклад, як зробити посилання невалідним
● Стек та виклик функцій
● Угода про виклик функцій
● Масиви як параметри функції. Способи оголошення масиву як параметра функції та часті помилки. Проблема отримання кількості елементів масиву у функції
● std::array, std::string_view, std::span як безпечний спосіб передачі масиву у функцію
● Рекурсія. Inline-функції
● Проблеми при поверненні локальних змінних з функції посилання або вказівнику

8. ПРОСТІ КОРИСТУВАЛЬНІ ТИПИ ДАНИХ

● Що таке структури. Які вони вирішують проблеми
● Оголошення структур
● Способи доступу до полів структури
● Способи ініціалізації структур до С++11
● Ініціалізація структур починаючи з С++11
● Розмір структур. Що таке вирівнювання структур? Що таке padding у структурах
● Нейменовані структури
● Struct binding С++17. Які проблеми вирішує
● Що таке перерахування та які воно вирішує проблеми
● Що таке unscoped-перерахування та які у нього проблеми
● Що таке scoped-перерахування, починаючи з С++11 і які він вирішує проблеми
● Що таке об'єднання. Які він вирішує проблеми
● std::variant як безпечний union
● Що таке каламбур типів та як об'єднання допомагає у перетворенні несумісних типів

9. РОБОТА З ДИНАМІЧНОЮ ПАМ'ЯТЬЮ

● Відмінність роботи зі стековою пам'яттю та динамічною пам'яттю
● Що таке менеджер пам'яті або чому динамічне виділення пам'яті таке дороге
● Робота з динамічною пам'яттю, використовуючи функції С
● Робота з динамічною пам'яттю, використовуючи C++-підхід
● Можливі проблеми з динамічною пам'яттю
● Динамічні масиви, безпечна робота з динамічними контейнерами в STL

10. КЛАСИ ТА ОБ'ЄКТИ (ООП)

● Базові поняття ООП
● Що є недоліком функціонального програмування та які завдання вирішує ОВП
● Основні кити ООП
● Синтаксис оголошення класу
● Що таке поля класу
● Створення об'єкта класу
● Рівні доступу в класі
● Способи оголошення константних полів у класі до С++11 та після
● Що таке статичні поля
● Що таке метод класу? Чим відрізняється метод від звичайної функції
● Що таке це. Що таке угода про виклик
● Способи оголошення методів класу. Чим відрізняються визначення методу всередині класу від визначення за межами класу
● Що таке константні методи та які вони вирішують проблеми.
● Ключове слово mutable
● Що таке статичні методи і чим вони відрізняються від звичайних методів

11. КОНСТРУКТОРИ І ДЕСТРУКТОРИ

● Що таке конструктор та які він вирішує проблеми
● Види конструкторів до С++11
● Список ініціалізації. Спосіб ініціалізації полів класу, починаючи з +11. Підводне каміння при ініціалізації полів класу
● Навіщо потрібний конструктор копіювання та оператор присвоєння
● Що таке деструктор і які він вирішує проблеми
● Правильна сигнатура для конструкторів та оператора присвоєння
● Перевантаження конструкторів
● Порядок ініціалізації полів під час створення об'єкта

12. НАСЛІДКА

● Що таке успадкування та які воно вирішує проблеми
● Види успадкування
● Розташування об'єктів у пам'яті під час наслідування
● Порядок ініціалізації під час наслідування. Підводні камені
● Порядок викликів під час руйнування об'єкта
● Shadowing-методи при успадкування
● Множинне успадкування. У чому відмінність від одиночного успадкування. Підводне каміння множинного успадкування
● Неоднозначність виклику методу при множинному наслідуванні
● Проблема ромбового наслідування
● Що таке віртуальне успадкування і навіщо воно потрібне в контексті успадкування
● Ключове слово final

13. ВІРТУАЛЬНІ ФУНКЦІЇ

● Що таке поліморфізм
● Що таке віртуальна функція
● Що таке динамічний та статичний поліморфізм і як він реалізується у мові С++
● Ключове слово override та які він вирішує проблеми у контексті віртуальних функцій
● Що таке віртуальний деструктор і навіщо він потрібний
● Що таке суто віртуальні функції. Що таке абстрактний клас

14. ШАБЛОНИ

● Що таке шаблони та узагальнене програмування
● Шаблони класу
● Що таке інстанція шаблону
● Проблема роздування коду
● Установки шаблону. Передача значення як шаблонний аргумент
● Спеціалізація. Часткова спеціалізація. Явна спеціалізація
● Шаблонні функції
● Шаблонний метод. Шаблонний конструктор. Які завдання вони дозволяють вирішити
● Різниця у виклику шаблонного класу та шаблонної функції
● Явна спеціалізація шаблону функції

15. ПЕРЕВАНТАЖЕННЯ ОПЕРАТОРІВ

● Що таке перевантаження операторів
● Коли варто застосовувати перевантаження операторів
● Які операції можна перевантажувати
● У чому різниця між перевантаженням оператора як методом класу та звичайною функцією
● Базові угоди про перевантаження операторів
● Тонкості при перевантаженні пре- та пост-інкременту та декременту
● Рекомендації щодо написання інтерфейсу навантаження операторів

16. БАЗОВІ ПОНЯТТЯ ПРО КОМПІЛЯЦІЮ І СИСТЕМИ ЗБІРКИ

● Що таке препроцесинг
● Що таке компіляція
● Що таке лінковник
● Види компіляторів та їх особливості
● Що таке роздільна компіляція
● Що таке заголовковий файл
● Що таке сторожі

17. MOVE СЕМАНТИКА

● Що таке move семантика та яку ключову роль вона відіграє в сучасному С++?
● Що таке rvalue посилання?
● Що таке value category та які категорії існують у мові С++ (lvalue, prvalue тощо)?
● Конструктор переміщення
● Оператор переміщення
● Порівняння продуктивності між класом, що реалізує лише копіювальну поведінку, та класом, що реалізує переміщувальну поведінку
● std::move
● Поради про те, коли варто коректно застосовувати переміщуючі операції (коли move семантика не допомагає?)


18. КОНСТРУКТОРИ І ДЕСТРУКТОРИ

● Правило викликів конструкторів, операторів присвоєння базового класу
● Правило 3-х до С++11
● Правило 0 або правило 5-ти після С++11
● Правила генерації конструкторів та операторів за різних полів
● Коли варто писати клас, який підтримує лише копіювальну поведінку, а коли лише переміщує?
● Ключове слово default для конструкторів та операторів, важливість його написання на відміну від явного визначення тіла конструктора
● Ключове слово delete при оголошенні конструкторів, операторів та деструкторів
● Проблеми впливу користувача конструктора на неявне перетворення типів. Ключове слово explicit
● Ключове слово using при успадкування
● Різниця між оголошенням конструкторів та операторів присвоєння (як приватні методи) та оголошенням їх за допомогою ключового слова delete
● Що таке delegating constructors?
● Reference-qualified методи класу
● Помилкове застосування move семантики при успадкування
● Copy elision, RVO NRVO

19. ОПТИМІЗАЦІЯ

● Етапи компіляції
● Оптимізація компілятора (inline, const)
● Шаблони як частина оптимізації на етапі компіляції
● constexpr та його важливість у кожному стандарті С++

20. ВИСНОВОК ТИПУ В С++ (TYPE DEDUCTION)

● Виведення типу за допомогою ключового слова auto: чи насправді такий тип?
● Ключове слово decltype

21. ШАБЛОНИ

● Ключове слово typename у шаблонах та його важливість
● Type traits властивості типу, виділення найважливіших та розгляд їх на прикладах
● SFIANE. Застосування std::enable_if і навіщо його можна використовувати у коді?
● std::enable_if як спосіб реалізації часткової спеціалізації для шаблонів функцій
● if constexprt як можливість елегантної заміни складних конструкцій std::enable_if
● Variadic template vs Fold expression
● Універсальні посилання
● Perfect forwarding, важливість функції std::forward
● Шаблонні методи та їх відмінність від шаблонного класу

22. ДИНАМІЧНИЙ ПОЛІМОРФІЗМ

● Особливості роботи з динамічним поліморфізмом (virtual functions)
● Аргумент за промовчанням, які він приховує проблеми у контексті?
● static_cast vs dynamic_cast
● RTTI, структура type_info
● Приклад динамічного поліморфізму на одному з патернів проектування
● Virtual destructor для уникнення memory leaks

23. ЛЯМБДИ

● Вказівник на функцію
● Функтор
● Лямбда, список захоплення
● Застосування auto в аргументах лямбди
● Ключове слово mutable та навіщо його необхідно оголосити у сигнатурі лямбди?

24. РОЗУМНІ ПОКАЗНИКИ

● 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?

25. ВИКЛЮЧНІ СИТУАЦІЇ

● Виняткові ситуації. Їхнє важливе застосування
● Виняткові ситуації 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, який не кидає виключення

26. ПРОСТІР ІМЕН

● Що таке простір імен і які проблеми вони вирішують у великому коді?
● Inline namespace (provide library version)
● Вкладені простори імен
● Using-directive, Using-declaration
● ADL (argument dependent lookup), правила пошуку імен

27. ПОТОКИ В С++

● Основи мультипоточності
● 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 – це не механізм синхронізації потоку

28. БІБЛІОТЕКА STL

● Що таке бібліотека STL? Що вона дозволяє вирішувати у повсякденному програмуванні?
● Контейнери у STL. Їх структура, особливості та які вони вирішують завдання
● Ітератори. Що це? Навіщо вони потрібні? Їхні властивості. Приклад написання свого ітератора
● Що таке компаратори? std::bind
● Алгоритми. Важливість ітераторів під час роботи з алгоритмами. Розгляд категорій алгоритмів
● Псевдоконтейнери
● STL – це не тільки контейнери-ітератори-алгоритми