Курс C++ Pro
Ви будете писати програми будь-якої складності
однією з найбільш прогресивних мов програмування
C++ — одна з найскладніших мов, яка потребує від вас посидючості й терпіння, але ваша затребуваність завжди буде на висоті. Ви можете створювати топові продукти будь-якої складності, адже на С++ можна писати все: драйвери пристроїв, програми для пристроїв IoT, десктопні прикладні програми: ігри, бізнес-додатки, сервери для мережевих служб і багато іншого.
—Ви навчитеся різноманітних прийомів програмування на C++, познайомитесь з принципами об’єктно-орієнтованої розробки, створення GUI-додатків мовою С++ за допомогою бібліотеки Qt. А ще ви дізнаєтеся все про контейнери, алгоритми й адаптери, будете розбиратися в архітектурі додатків і модульному тестуванні ПЗ.
- Теорії без практики
- Застарілих механік роботи
- Переказу чужих лекцій і книг
- Питань без відповіді
Це буде захоплююче та ефективно!
- Що таке мова програмування?
- Машинні мови
- Низькорівневі мови (мова асемблера)
- Високорівневі мови
- Транслятори
- Компіляція
- Інтерпретація
- Парадигми програмування
- Модульна парадигма програмування
- Функціональна парадигма програмування
- Узагальнена парадигма програмування
- Об’єктно-орієнтована парадигма програмування
- Історія С++
- Що таке система контролю версії і що вона вирішує?
- Основні елементи Git
- Що таке коміт?
- Що таке гілка?
- Способи створення сховища. Види сервісів, що дозволяють створити віддалений репозиторій
- Базові команди Git
- Практика. Створення репозиторію локально. Створення репозиторію на віддаленому сервері
- Приклад простої програми С++
- Базові способи збірки додатку
- Алфавіт мови
- Що таке лексеми?
- Ідентифікатор як важлива складова програми
- Що таке ключові слова?
- Коментарі (однорядкові, багаторядкові)
- Що таке літера? Види літералів. Їхня значущість у коді
- Чим відрізняються строковий літерал від інших типів літералів?
- Що таке інструкції?
- Що означає синтаксична помилка? Приклад простої синтаксичної помилки
- Що таке змінна? Синтаксис оголошення змінної
- Тип даних. Що таке сувора типізація? Навіщо змінній потрібен тип даних?
- Цілочисельний тип даних
- Символьні типи
- Цілочисельні типи починаючи з С++11. Які проблеми вони розв’язують?
- Що таке аліас на тип даних? Приклад з описом typedef. Розуміння типів size_t та time_t як аліасів на вбудовані типи
- Тип void як маркер різного контексту. Приклад контексту використання цього типу
- Логічний тип даних
- Речові типи даних. Можливі підводні камені уявлення в пам’яті
- Види операторів (унарний, бінарний, тернарний). Їхній синтаксис
- Неявне перетворення при операторі присвоєння? Що таке зрізка? Що таке звужувальне перетворення? Проблема знакового та беззнакового перетворення
- Явне перетворення типів (С підходить і С++ підхід)
- Арифметичні операції
- Проблема арифметичних операцій. Цілочисельне ділення на нуль, переповнення тощо
- Змішані вираження. Пріоритет операцій
- Автоматичний висновок типу як розв’язання проблеми перетворення в арифметичних виразах
- Тимчасова змінна як результат проміжного обчислення виразу. Як виглядає тимчасова змінна в створеному асемблерному коді (простий опис)?
- Базові поняття про Rvalue і Lvalue
- Складовий оператор
- Умовний оператор if. Приклад можливих проблем з висячими else. Різні підходи до написання оператора if задля уникнення спагеті-коду
- Що таке область видимості? Що таке блок?
- Оператор вибору switch. Проблема fall through. У чому відмінність між оператором вибору switch і логічним оператором if?
- Що таке compile time і run time вираження на прикладі case гілок оператора вибору switch?
- Оператор циклу for. Способи оголошення циклу for. Для чого потрібен вічний цикл? Можливі проблеми знакового та беззнакового порівняння і їхні наслідки
- Оператор циклу while
- Оператор циклу do while. Використання do while задля розв’язання проблем з розгалуженням коду із застосуванням оператора if
- Тернарний оператор
- Просте розуміння точки наслідування на прикладі коми
- Що таке масив і в чому його переваги?
- Оголошення масивів. Способи вказівки розміру масиву. Ініціалізація масиву. Можливі помилки при ініціалізації масиву
- Масив змінної довжини як розширення компілятора. Прапор компіляції — pedantic
- Масив символом vs строки. Способи оголошення. Що таке символ «термінальний нуль»? Можливі проблеми при ініціалізації символьного масиву
- Доступ до елементів масиву
- Що таке вихід за межі масиву? Що таке buffer overflow?
- Цикли як спосіб обходу, обробки та виведення масиву на екран
- Часті помилки у виборі типу для змінної циклу при роботі з масивом
- Базові поняття про стек пам’яті
- Що таке локальні змінні і як змінні створюються на стеку? Що таке автоматичне керування пам’яттю?
- Поняття покажчика
- Оголошення покажчиків
- Способи ініціалізації вказівника. Що таке невалідний покажчик? Що таке розіменування покажчика і якими є можливі проблеми при його проведенні? Nullptr як правильний літерал для ініціалізації покажчика. Що таке покажчик на тип? Розмір покажчика, моделі пам’яті різних ОС та платформ. Покажчики типу void
- Що таке константний покажчик і покажчик на const? Розбір можливих помилок
- Арифметика з покажчиками. Чим відрізняється арифметика з покажчиками від арифметики зі змінними?
- Що спільного між масивом і покажчиком? Як обходити масив за допомогою покажчика? Що означає покажчик на елемент за останнім елементом масиву й навіщо так робити?
- Що таке функція і які вона вирішує проблеми в коді
- Синтаксис функції
- Базове поняття що таке оголошення і визначення функції. Приклад відмінності
- Що таке списки параметрів. Спосіб виклику функції. Завдання значення за замовчуванням для параметру
- Значення, що повертається з функції. auto як автоматичне виведення, що повертається. Проблеми при автоматичному виведенні типу. Тип void як маркер необоротного значення функції
- Передача параметрів за значенням
- Що таке фактичні й формальні параметри
- Неправильне використання auto як параметру функції та, як наслідок, розширення компіляторів
- Що таке глобальні змінні. Проблема приховування імен глобальних і локальних змінних
- Передача за вказівником. Спосіб повернення декількох значень з функції
- Що таке посилання. У чому відмінність посилання від покажчика
- Посилання як частина інтерфейсу функції
- Які проблеми вирішує посилання в порівнянні з покажчиком як параметр функції. Які переваги константної посилання. Чому можна передавати Rvalue, як аргумент константної посилання
- Приклад як зробити посилання невалідною
- Стек і виклик функцій
- Угода про виклик функцій
- Масиви як параметри функції. Способи оголошення масиву як параметру функції і часті помилки. Проблема отримання кількості елементів масиву в функції
- Рекурсія. Inline-функції
- Що таке перевантаження функцій. Що таке mangling імен функції на прикладі генерації ассемблерного коду
- Чому перевантаження недоступне в мові С. Простий опис ключового слово extern «C» як приклад опису перевантаження
- Що таке покажчик на функцію та які проблеми вирішує передача функції як параметр функції на прикладі алгоритму сортування
- Базові поняття що таке lambda як заміна вказівника на функцію. Що таке std :: function
- Проблеми при поверненні локальних змінних з функції за посиланням або вказівником
- Зняття константності з аргументу використання std :: const_cast
- Що таке простори імен
- Що таке вкладені простори імен
- Нові можливості оголошення просторів імен в С++17
- Що таке структури. Які вони вирішують проблеми
- Оголошення структур
- Способи доступу до полів структури
- Способи ініціалізації структур до С++11
- Ініціалізація структур починаючи з С++11
- Розмір структур. Що таке вирівнювання структур. Що таке padding в структурах
- Неіменовані структури
- Struct binding С++ 17, які він вирішує проблеми
- Що таке перерахування і які воно вирішує проблеми
- Що таке unscoped перерахування і які у нього проблеми
- Що таке scoped-перерахування починаючи з С++11 і які він вирішує проблеми
- Що таке об’єднання. Які воно вирішує проблеми
- Що таке каламбур типів і як об’єднання допомагає в перетворенні несумісних типів
- Базові поняття про моделі пам’яті. Їхні особливості і відмінності
- Відмінність роботи зі стековою пам’яттю і динамічною пам’яттю (купа)
- Що таке менеджер пам’яті або чому динамічне виділення пам’яті таке дороге
- Робота з динамічною пам’яттю використовуючи З функції
- Робота з динамічною пам’яттю використовуючи С++-підхід
- Можливі проблеми при роботі з динамічною пам’яттю
- Базові поняття ООП
- Що є недоліком функціонального програмування і які завдання вирішує ООП
- Основні кити ООП
- Синтаксис оголошення класу
- Що таке поля класу
- Створення об’єкту класу
- Рівні доступу в класі
- Способи оголошення константних полів в класі до С++11 і після
- Що таке статичні поля
- Що таке метод класу. Чим відрізняється метод від звичайної функції
- Що таке this. Що таке угода про виклик thiscall
- Способи оголошення методів класу. Чим відрізняється визначення методу всередині класу від визначення за межами класу
- Що таке константні методи і які вони вирішують проблеми. Ключове слово mutable
- Що таке статичні методи і чим вони відрізняються від звичайних методів
- Що таке конструктор і які він вирішує проблеми
- Види конструкторів до С++11
- Список ініціалізації. Спосіб ініціалізації полів класу починаючи з С++11.
- Підводні камені при ініціалізації полів класу
- Навіщо потрібен конструктор копіювання і оператор присвоювання
- Що таке деструктор і які він вирішує проблеми
- Правильна сигнатура для конструкторів і оператора присвоювання
- Перевантаження конструкторів
- Порядок ініціалізації полів при створенні об’єкту
- Що таке успадкування і які воно вирішує проблеми
- Види успадкування
- Що таке успадкування (public-успадкування)
- Розташування об’єктів в пам’яті при успадкуванні
- Порядок ініціалізації при успадкуванні. Підводні камені
- Порядок викликів при руйнуванні об’єкту
- Shadowing-методи при успадкуванні
- Множинне успадкування. У чому відмінність від одиночного успадкування. Підводні камені множинного успадкування
- Неоднозначність виклику методу при множині успадкування
- Проблема ромбового успадкування
- Що таке віртуальне успадкування і навіщо воно потрібне в контексті успадкування
- Ключове слово final
- Що таке поліморфізм
- Що таке віртуальна функція
- Що таке динамічний і статичний поліморфізм і як він реалізується в мові С++
- Ключове слово override і які воно вирішує проблеми в контексті віртуальних функцій
- Що таке віртуальний деструктор і навіщо він потрібен
- Що таке чисто віртуальні функції. Що таке абстрактний клас
- Що таке vtable і vtpr. На що вони впливають
- Що таке шаблони і узагальнене програмування
- Що спільного між макросом і шаблоном. Які проблеми макросу
- Шаблони класу
- Що таке інстанціювання шаблону
- Проблема роздування коду
- Параметри шаблону. Передача значення в якості шаблонного аргументу
- Спеціалізація. Часткова спеціалізація. Явна спеціалізація
- Шаблонні функції
- Шаблонний метод. Шаблонний конструктор. Які завдання вони дозволяють вирішити
- Різниця у виклику шаблонного класу і шаблонної функції
- Явна спеціалізація шаблону функції
- Що таке перевантаження операторів
- Коли варто застосовувати перевантаження операторів
- Які операції дозволено перевантажувати
- У чому різниця між перевантаженням оператору як методом класу і звичайною функцією
- Базові угоди про перевантаження операторів
- Тонкощі при перевантаженні пре- і пост-інкременту і декременту
- Рекомендації з написання інтерфейсу перевантаження операторів
- Особливості перевантаження виведення на потік
- Що таке простори імен. Їхні застосування. Які вони вирішують проблеми
- Що таке неіменовані простори імен, що спільного між static і неіменованими просторами імен
- Що таке пре-процессінг
- Що таке компіляція
- Що таке лінковщик
- Види компіляторів і їхні особливості
- Що таке роздільна компіляція
- Що таке заголовний файл
- Що таке вартові
- Що таке бібліотеки
- Система збирання Make
- CMake як генератор системи збирання
- Що таке move-семантика, яку ключову роль вона грає в сучасному С++?
- Що таке rvalue-посилання?
- Що таке value category та які категорії існують у мові С++ (lvalue, prvalue тощо)?
- Конструктор переміщення
- Оператор переміщення
- Порівняння продуктивності між класом, який реалізує тільки копіювальну поведінку, та класом, що реалізує переміщувальну поведінку
- std::move
- Поради про те, коли варто коректно застосовувати переміщувальні операції. Коли move-семантика не допомагає?
- Правило виклику конструкторів, операторів присвоєння базового класу
- Правило 3-х до С++11
- Правило 0 чи правило 5-ти після С++11
- Правила генерації конструкторів та операторів при різних полях
- Коли варто писати клас, який підтримує тільки копіювальну поведінку, а коли — тільку переміщувальну?
- Ключове слово default для конструкторів та операторів, важливість його написання на відміну від явного визначення тіла конструктора
- Ключове слово delete при оголошенні конструкторів, операторів та деструкторів
- Проблеми впливу користувацького конструктора на неявне перетворення типів. Ключове слово explicit
- Ключове слово using при наслідуванні
- Різниця між оголошенням конструкторів та операторів присвоєння (як приватні методи) і оголошення їх за допомогою ключового слова delete
- Що таке delegating constructors?
- Reference-qualified методи класу
- Помилкове застосування move-семантики при наслідуванні
- Copy elision, RVO NRVO
- Етапи компіляції
- Оптимизація компілятора (inline, const)
- Шаблони як частина оптимізації на етапі компіляції
- Ключове слово constexpr та його важливість кожному стандарту С++
- Вивід типу за допомогою ключового слова auto: чи такий тип насправді?
- Ключове слово decltype
- Ключове слово typename в шаблонах та його важливість
- Type traits властивості типу, виділення найважливіших та розгляд їх на прикладах
- SFIANE. Застосування std::enable_if та чому його можна використовувати в коді?
- Тип std::enable_if як спосіб реалізації часткової спеціалізації для шаблонної функції
- Оператор if constexprt як можливість елегантної заміни складних конструкцій std::enable_if
- Variadic template vs Fold expression
- Універсальні посилання
- Perfect forwarding, важливість функції std::forward
- Шаблонні методи та їхня відмінність від шаблонного класу
- Особливості роботи з динамічним поліморфізмом (virtual functions)
- Аргумент за замовчуванням: які проблеми в контексті він приховує?
- Операції static_cast та dynamic_cast
- RTTI, структура type_info
- Приклад динамічного поліморфізму на одному з патернів проектування
- Virtual destructor для уникнення memory leaks
- Вказівник на функцію
- Функтор
- Лямбда, список захоплення
- Застосування auto в аргументах лямбди
- Ключове слово mutable та чому його необхідно оголосити в сигнатурі лямбди?
- Функції 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?
- Виняткові ситуації. Їхнє важливе застосування
- Виняткові ситуації 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, який не кидає винятки
- Що таке простори імен та які проблеми вони розв’язують у великому коді?
- Inline namespace (provide library version)
- Вкладені простори імен
- Using-directive, Using-declaration
- ADL (argument dependent lookup), правила пошуку імен
- Основи багатопотоковості
- 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 — це не механізм синхронізації потоку
- Що таке бібліотека STL? Що вона дозволяє вирішувати в повсякденному програмуванні?
- Контейнери в STL. Їхня структура, особливості та які вони виконують задачі
- Ітератори. Що це? Чому вони потрібні? Їхні властивості. Приклад написання свого ітератора
- Що таке компаратори? Функція std::bind
- Алгоритми. Важливість ітераторів при роботі з алгоритмами. Розгляд категорій алгоритмів
- Псевдоконтейнери
- Network model OSI layers
- Поняття IPC (inter process communication)
- Що таке клієнт-сервер?
- Що таке протоколи обміну даними?
- Що таке socket, endpoint?
- TCP-протокол, реалізація TCP-клієнта та сервера
- UDP-протокол, реалізація UDP-клієнта та серверу
- Написання pool thread у прикладі при роботі з TCP-сервером
- Формати обміну даними (json і т. п.)
- GRPC. protobuf. Поняття серіалізації та десеріалізації даними
- Meta object compiler
- Сигнали та слоти
- QObject
- Базова робота з віджетами
- Event loop
- Структура QML-компонентів
- Базові графічні компоненти
- Взаємодія C++ & QML
- Кастомізація компонентів
- Компоненти ListView, GridView
- Сигнали/слоти в QML
- Реєстрація своїх класів в метасистемі
- Поняття моделі, їхні види
- Поняття делегата
- Поняття ролі
- Реалізація своєї моделі, її реєстрація, базові методи
- QAbstractListModel
- Багатопотоковість у Qt
- Поради щодо складання актуального резюме для ІТ-ринку
- Основи роботи в LinkedIn
- Інформація про soft skills
- Лайфхаки для новачків у фрілансі та на платформі Upwork
- Актуальні програми навчання
- Готовий проект після закінчення курсу
- Допомогу у працевлаштуванні після закінчення програми Roadmap
- Сертифікат про закінчення курсу