Курс C++ Pro в Дніпрі, навчання C++ з нуля | ITEA DNIPRO

Курс C++ Pro

Старт навчання
Старт курсу запитуйте в адміністрації
108 год. по 2-3 рази на тиждень

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

  • Використовувати основні структури для створення програм
  • Застосовувати принципи ООП для розробки програм
  • Розробляти консольні додатки в ОС Linux
  • Працювати зі стандартною бібліотекою С++ та бібліотекою Qt
  • Писати GUI-додатки
  • Працювати як у команді, так і соло на фрілансі
  • Володіти тайм-менеджментом для ефективного планування й виконання задач

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

1. Трішки історії

  • Що таке мова програмування?
  • Машинні мови
  • Низькорівневі мови (мова асемблера)
  • Високорівневі мови
  • Транслятори
  • Компіляція
  • Інтерпретація
  • Парадигми програмування
  • Модульна парадигма програмування
  • Функціональна парадигма програмування
  • Узагальнена парадигма програмування
  • Об’єктно-орієнтована парадигма програмування
  • Історія С++

2. Основи GIT-системи контролю версії

  • Що таке система контролю версії і що вона вирішує?
  • Основні елементи Git
  • Що таке коміт?
  • Що таке гілка?
  • Способи створення сховища. Види сервісів, що дозволяють створити віддалений репозиторій
  • Базові команди Git
  • Практика. Створення репозиторію локально. Створення репозиторію на віддаленому сервері

3. Зміст С++ мови

  • Приклад простої програми С++
  • Базові способи збірки додатку
  • Алфавіт мови
  • Що таке лексеми?
  • Ідентифікатор як важлива складова програми
  • Що таке ключові слова?
  • Коментарі (однорядкові, багаторядкові)
  • Що таке літера? Види літералів. Їхня значущість у коді
  • Чим відрізняються строковий літерал від інших типів літералів?
  • Що таке інструкції?
  • Що означає синтаксична помилка? Приклад простої синтаксичної помилки

4. Змінні й типи даних

  • Що таке змінна? Синтаксис оголошення змінної
  • Тип даних. Що таке сувора типізація? Навіщо змінній потрібен тип даних?
  • Цілочисельний тип даних
  • Символьні типи
  • Цілочисельні типи починаючи з С++11. Які проблеми вони розв’язують?
  • Що таке аліас на тип даних? Приклад з описом typedef. Розуміння типів size_t та time_t як аліасів на вбудовані типи
  • Тип void як маркер різного контексту. Приклад контексту використання цього типу
  • Логічний тип даних
  • Речові типи даних. Можливі підводні камені уявлення в пам’яті

5. Основні операції С++

  • Види операторів (унарний, бінарний, тернарний). Їхній синтаксис
  • Неявне перетворення при операторі присвоєння? Що таке зрізка? Що таке звужувальне перетворення? Проблема знакового та беззнакового перетворення
  • Явне перетворення типів (С підходить і С++ підхід)
  • Арифметичні операції
  • Проблема арифметичних операцій. Цілочисельне ділення на нуль, переповнення тощо
  • Змішані вираження. Пріоритет операцій
  • Автоматичний висновок типу як розв’язання проблеми перетворення в арифметичних виразах
  • Тимчасова змінна як результат проміжного обчислення виразу. Як виглядає тимчасова змінна в створеному асемблерному коді (простий опис)?
  • Базові поняття про Rvalue і Lvalue
  • Складовий оператор

6. Оператори, що керують ходом виконання програми

  • Умовний оператор if. Приклад можливих проблем з висячими else. Різні підходи до написання оператора if задля уникнення спагеті-коду
  • Що таке область видимості? Що таке блок?
  • Оператор вибору switch. Проблема fall through. У чому відмінність між оператором вибору switch і логічним оператором if?
  • Що таке compile time і run time вираження на прикладі case гілок оператора вибору switch?
  • Оператор циклу for. Способи оголошення циклу for. Для чого потрібен вічний цикл? Можливі проблеми знакового та беззнакового порівняння і їхні наслідки
  • Оператор циклу while
  • Оператор циклу do while. Використання do while задля розв’язання проблем з розгалуженням коду із застосуванням оператора if
  • Тернарний оператор
  • Просте розуміння точки наслідування на прикладі коми

7. Масиви

  • Що таке масив і в чому його переваги?
  • Оголошення масивів. Способи вказівки розміру масиву. Ініціалізація масиву. Можливі помилки при ініціалізації масиву
  • Масив змінної довжини як розширення компілятора. Прапор компіляції — pedantic
  • Масив символом vs строки. Способи оголошення. Що таке символ «термінальний нуль»? Можливі проблеми при ініціалізації символьного масиву
  • Доступ до елементів масиву
  • Що таке вихід за межі масиву? Що таке buffer overflow?
  • Цикли як спосіб обходу, обробки та виведення масиву на екран
  • Часті помилки у виборі типу для змінної циклу при роботі з масивом

8. Покажчик

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

9. Функції

  • Що таке функція і які вона вирішує проблеми в коді
  • Синтаксис функції
  • Базове поняття що таке оголошення і визначення функції. Приклад відмінності
  • Що таке списки параметрів. Спосіб виклику функції. Завдання значення за замовчуванням для параметру
  • Значення, що повертається з функції. auto як автоматичне виведення, що повертається. Проблеми при автоматичному виведенні типу. Тип void як маркер необоротного значення функції
  • Передача параметрів за значенням
  • Що таке фактичні й формальні параметри
  • Неправильне використання auto як параметру функції та, як наслідок, розширення компіляторів
  • Що таке глобальні змінні. Проблема приховування імен глобальних і локальних змінних
  • Передача за вказівником. Спосіб повернення декількох значень з функції
  • Що таке посилання. У чому відмінність посилання від покажчика
  • Посилання як частина інтерфейсу функції
  • Які проблеми вирішує посилання в порівнянні з покажчиком як параметр функції. Які переваги константної посилання. Чому можна передавати Rvalue, як аргумент константної посилання
  • Приклад як зробити посилання невалідною
  • Стек і виклик функцій
  • Угода про виклик функцій
  • Масиви як параметри функції. Способи оголошення масиву як параметру функції і часті помилки. Проблема отримання кількості елементів масиву в функції
  • Рекурсія. Inline-функції
  • Що таке перевантаження функцій. Що таке mangling імен функції на прикладі генерації ассемблерного коду
  • Чому перевантаження недоступне в мові С. Простий опис ключового слово extern «C» як приклад опису перевантаження
  • Що таке покажчик на функцію та які проблеми вирішує передача функції як параметр функції на прикладі алгоритму сортування
  • Базові поняття що таке lambda як заміна вказівника на функцію. Що таке std :: function
  • Проблеми при поверненні локальних змінних з функції за посиланням або вказівником
  • Зняття константності з аргументу використання std :: const_cast

10. Простори імен

  • Що таке простори імен
  • Що таке вкладені простори імен
  • Нові можливості оголошення просторів імен в С++17

11. Прості типи даних, які призначені для користувача

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

12. Робота з динамічною пам'яттю

  • Базові поняття про моделі пам’яті. Їхні особливості і відмінності
  • Відмінність роботи зі стековою пам’яттю і динамічною пам’яттю (купа)
  • Що таке менеджер пам’яті або чому динамічне виділення пам’яті таке дороге
  • Робота з динамічною пам’яттю використовуючи З функції
  • Робота з динамічною пам’яттю використовуючи С++-підхід
  • Можливі проблеми при роботі з динамічною пам’яттю

13. Класи й об'єкти (ООП)

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

14. Конструктори і деструктори

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

15. Успадкуванння

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

16. Віртуальні функції

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

17. Шаблони

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

18. Перезавантаження операторів

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

19. Простори імен

  • Що таке простори імен. Їхні застосування. Які вони вирішують проблеми
  • Що таке неіменовані простори імен, що спільного між static і неіменованими просторами імен

20. Базові поняття про компіляцію та системи збірки

  • Що таке пре-процессінг
  • Що таке компіляція
  • Що таке лінковщик
  • Види компіляторів і їхні особливості
  • Що таке роздільна компіляція
  • Що таке заголовний файл
  • Що таке вартові
  • Що таке бібліотеки
  • Система збирання Make
  • CMake як генератор системи збирання

21. Move-семантика

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

22. Конструктори та деструктори

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

23. Оптимізація

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

24. Вивід типу в С++ (type deduction)

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

25. Шаблони

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

26. Динамічний поліморфізм

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

27. Лямбди

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

28. Розумні вказівники

  • Функції new та malloc
  • RAII
  • Функції std::unique_ptr та 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?

29. Виключні ситуації

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

30. Простори імен

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

31. Потоки в С++

  • Основи багатопотоковості
  • Concurrency vs parallelism
  • Функція std::thread. Що таке join і detach, та чому їх варто викликати?
  • Передача параметрів в потоки та можливі підводні камені
  • Значення, що повертається з потоку при роботі з std::thread. std::future and std::promise
  • Виняткові ситуації в потоках
  • Функції std::async та std::thread. Особливість std::future в std::async
  • Поняття data race, race conditions. Можливі проблеми при роботі в багатопотоковому коді
  • Що таке об`’ктb синхронізації в багатопотоковому коді? Важливість їхнього застосування
  • 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 — це не механізм синхронізації потоку

32. Бібліотека STL

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

33. Опціональні теми (вибір теми): мережі програмування з оглядом бібліотеки boost чи QT


34. Мережеве програмування та бібліотека boost.asio

  • Network model OSI layers
  • Поняття IPC (inter process communication)
  • Що таке клієнт-сервер?
  • Що таке протоколи обміну даними?
  • Що таке socket, endpoint?
  • TCP-протокол, реалізація TCP-клієнта та сервера
  • UDP-протокол, реалізація UDP-клієнта та серверу
  • Написання pool thread у прикладі при роботі з TCP-сервером
  • Формати обміну даними (json і т. п.)
  • GRPC. protobuf. Поняття серіалізації та десеріалізації даними

35. Огляд бібліотеки boost. QT

  • Meta object compiler
  • Сигнали та слоти
  • QObject
  • Базова робота з віджетами
  • Event loop
  • Структура QML-компонентів
  • Базові графічні компоненти
  • Взаємодія C++ & QML
  • Кастомізація компонентів
  • Компоненти ListView, GridView
  • Сигнали/слоти в QML
  • Реєстрація своїх класів в метасистемі
  • Поняття моделі, їхні види
  • Поняття делегата
  • Поняття ролі
  • Реалізація своєї моделі, її реєстрація, базові методи
  • QAbstractListModel
  • Багатопотоковість у Qt

36. Як скласти резюме і пройти співбесіду

  • Структура резюме
  • FAQ
  • Як вести себе на співбесіді
  • Основні помилки на співбесіді
  • Урок англійської мови №1
  • Урок англійської мови №2
  • Урок пошуку роботи

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

spinner-it

Курс на IT — повний вперед! Дізнатись актуальний розклад