План навчання: Курс C++ — Продовження (Статті 29–60+)
План навчання: Курс C++ — Продовження (Статті 29–60+)
Цей документ є академічним планом розвитку навчального курсу C++ на платформі
kostyl.dev. Він описує логічну структуру, тематичний зміст та педагогічні вимоги до кожної статті, яка має бути розроблена після існуючих 28 статей (до теми аргументів командного рядка включно). Стиль викладу — академічний, текстоцентричний («text-first»), з активним використанням компонентів Docus для інтерактивності.
Стан курсу на момент планування
Завершені статті (01–28)
| № | Файл | Тема |
|---|---|---|
| 01 | 01.intro-algorithms.md | Вступ до алгоритмів та програмування |
| 02 | 02.code-style.md | Стиль коду та оформлення |
| 03 | 03.ide-setup.md | Налаштування IDE (CLion / VS Code) |
| 04 | 04.data-output.md | Виведення даних (std::cout) |
| 05 | 05.data-types-variables.md | Типи даних та змінні |
| 06 | 06.data-input.md | Введення даних (std::cin) |
| 07 | 07.operators-type-conversion.md | Оператори та перетворення типів |
| 08 | 08.loops.md | Цикли (for, while, do-while) |
| 09 | 09.arrays.md | Масиви |
| 10 | 10.sorting.md | Алгоритми сортування |
| 11 | 11.searching.md | Алгоритми пошуку |
| 12 | 12.functions-basics.md | Функції: основи |
| 13 | 13.functions-scope.md | Функції: область видимості |
| 14 | 14.functions-overloading-templates.md | Перевантаження та шаблони функцій |
| 15 | 15.pointers-basics.md | Вказівники: основи |
| 16 | 16.references.md | Посилання (references) |
| 17 | 17.pointers-const-arrays.md | Вказівники, const та масиви |
| 18 | 18.pointer-arithmetic.md | Арифметика вказівників |
| 19 | 19.dynamic-memory.md | Динамічна пам'ять (new/delete) |
| 20 | 20.void-pointers.md | Узагальнені вказівники (void*) |
| 21 | 21.pointers-to-pointers.md | Вказівники на вказівники |
| 22 | 22.member-access-operator.md | Оператор доступу до члена (->) |
| 23 | 23.foreach-loop.md | Цикл for на основі діапазону |
| 24 | 24.function-pointers.md | Вказівники на функції |
| 25 | 25.lambdas.md | Лямбда-вирази |
| 26 | 26.lambda-captures.md | Захоплення у лямбда-виразах |
| 27 | 27.ellipsis.md | Еліпсис (...) та варіадичні функції |
| 28 | 28.command-line-arguments.md | Аргументи командного рядка |
Загальна структура нових модулів
Курс продовжується трьома великими блоками, що логічно виростають із вивченого:
Модуль A: Користувацькі типи даних
└─ enum, enum class, typedef/using, struct, union
Модуль B: Об'єктно-орієнтоване програмування (ООП)
└─ Класи, конструктори, деструктори, інкапсуляція,
спадкування, поліморфізм, абстрактні класи
Модуль C: Стандартна бібліотека та сучасний C++
└─ std::string, std::vector, std::array, std::map,
std::optional, smart pointers, move semantics,
шаблони класів, обробка виключень
Модуль A: Користувацькі типи даних (Статті 29–33)
Логіка модуля
Після опанування функцій, вказівників і лямбда-виразів студент може будувати
складні алгоритми, але йому бракує засобів для семантично точного іменування
станів і концепцій програми. Цей модуль заповнює прогалину: enum дає назви
станам, struct — групує пов'язані дані, а union забезпечує роботу з
варіантними даними за умов жорстких обмежень пам'яті.
Стаття 29 — Перерахування (enum)
Файл: 29.enum.mdОрієнтовний обсяг: 2 500–3 500 слів
Залежності: 05.data-types-variables.md, 07.operators-type-conversion.md
Навчальні цілі
- Пояснити мотивацію появи перерахувань: проблема «магічних чисел».
- Навчити оголошувати та використовувати
enum. - Показати внутрішнє представлення (
int), явне присвоєння значень. - Пояснити обмеження «незахищених» (
unscoped) перерахувань. - Показати практичні патерни: коди помилок, стани стейт-машини.
Структура статті
- Вступ і Hook: Сценарій функції
readFile(), що повертає-1,-2,-3. Читач бачить код із «магічними числами» і питає: «Що означає-2?» Відповідь — перерахування. - Фундаментальні концепції
- Визначення: що таке перелічуваний тип (enumerated type).
- Синтаксис
enum, ключове слово, тіло, крапка з комою. - Поняття «енумератор» (enumerator) — іменована константа всередині enum.
- Механіка та внутрішнє представлення
- Автоматичне присвоєння цілочисельних значень (з 0).
- Явне присвоєння значень, від'ємні значення, повторювані значення.
- Компілятор не перешкоджає дублюванню — чому це небезпечно.
- Розмір enum в пам'яті (
sizeof); зв'язок ізint. - Компонент
::debugger-viewдля візуалізації значень. - Компонент
::memory-viewдля демонстрації байтів.
- Неявні перетворення та обробка
- Неявна конвертація enum → int (дозволена).
- Заборона int → enum без
static_cast. - Заборона введення через
std::cinбез tricks. - Виведення
std::cout— числовий результат, функціяprintEnum.
- Простір імен перерахувань (проблема)
- Енумератори потрапляють у навколишній простір імен.
- Конфлікт імен між двома enum в одному файлі.
- Конвенція іменування
PREFIX_VALUEяк частковий обхідний шлях.
- Практичні патерни
- Коди повернення функцій замість магічних чисел.
- Стани кінцевого автомата (стейт-машина гри).
- Напрямки руху, сторони карти, режими роботи.
- Компонент
::terminal-previewдля демонстрації роботи програм.
- Практика та резюме
- Рівень 1: Оголосити enum
Directionз чотирма сторонами; вивести їх значення. - Рівень 1: Виправити код із магічними числами за допомогою enum.
- Рівень 2: Написати функцію
getStatusMessage(ParseResult), що повертає рядок. - Рівень 2: Реалізувати простий стейт-автомат гравця (стоїть, іде, біжить).
- Рівень 3: Реалізувати систему статусів HTTP (200, 404, 500) через enum із функцією виводу та обробки помилок.
- Рівень 1: Оголосити enum
Стаття 30 — Класи-перерахування (enum class)
Файл: 30.enum-class.mdОрієнтовний обсяг: 2 000–3 000 слів
Залежності: 29.enum.md
Навчальні цілі
- Пояснити недоліки «незахищених» enum: витік у простір імен, неявна конвертація.
- Ввести
enum class(scoped enumeration) як відповідь C++11. - Показати синтаксис, область видимості, оператор
::. - Розкрити суворі правила типізації: заборона неявних порівнянь різних enum.
- Навчити явної конвертації через
static_cast. - Показати задання базового типу (
enum class X : uint8_t).
Структура статті
- Вступ і Hook: Демонстрація «тихого» баґу — порівняння
Fruit::LEMON == Color::PINKпроходить компіляцію і повертаєtrue. Чому? Обидва мають значення0. Це реальна помилка, яку важко знайти. Рішення —enum class. - Фундаментальні концепції
- Поняття «scoped» vs «unscoped» перерахування.
- Синтаксис
enum class(абоenum struct— синоніми). - Оператор розширення імені (scope resolution operator
::) для доступу.
- Суворі правила типізації
- Неявна конвертація enum class → int заборонена.
- Порівняння двох різних enum class заборонене.
- Порівняння всередині одного enum class — дозволене.
- Приклад помилки компіляції та її пояснення.
- Явна конвертація
static_cast<int>(value)— коли і навіщо.static_cast<MyEnum>(intVal)— небезпека, UB (Undefined Behavior).- Патерн безпечної конвертації через
std::underlying_type_t.
- Задання базового типу
- Синтаксис
enum class Direction : uint8_t { ... }. - Навіщо: економія пам'яті у вбудованих системах, мережеві протоколи.
sizeofпорівняння.
- Синтаксис
- enum class у switch-statement
- Синтаксис
switch(dir)ізcase Direction::North:. - Попередження компілятора про неповний switch.
- Патерн з
defaultта[[fallthrough]].
- Синтаксис
- Порівняльна таблиця:
enumvsenum classВластивість enumenum classОбласть видимості Глобальна Локальна Неявна конвертація в int✅ ❌ Порівняння різних типів ✅ (баґ!) ❌ (захист) Задання базового типу Частково ✅ Рекомендованість у C++11+ ❌ ✅ - Практика та резюме
- Рівень 1: Переписати
enumіз попередньої статті наenum class; виправити звернення. - Рівень 1: Написати
switchдля виведення назви дня тижня. - Рівень 2: Реалізувати enum class
Permission : uint8_t(Read/Write/Execute) та функцію перевірки прав доступу. - Рівень 3: Реалізувати міні-парсер HTTP відповідей:
enum class HttpStatus : uint16_tз категоризацією (isSuccess(),isRedirect(),isError()).
- Рівень 1: Переписати
Стаття 31 — Псевдоніми типів (typedef і using)
Файл: 31.type-aliases.mdОрієнтовний обсяг: 2 000–2 800 слів
Залежності: 05.data-types-variables.md, 14.functions-overloading-templates.md
Навчальні цілі
- Пояснити призначення
typedef: читабельність, підтримка, кросплатформність. - Навчити синтаксису
typedef oldType newName. - Ввести
using newName = oldType(C++11) як переважний синтаксис. - Показати застосування для спрощення складних типів (вказівники на функції).
- Пояснити стандартні псевдоніми (
int8_t,uint32_tтощо).
Структура статті
- Вступ і Hook: Функція, що приймає
std::vector<std::pair<std::string, int>>тричі в прототипі. Читач відчуває біль. Рішення — один псевдонім. - typedef: синтаксис та семантика
typedef double seconds_t;— базовий патерн.- Суфікс
_tяк конвенція. - typedef не створює новий тип, лише псевдонім.
- Порядок: спочатку існуючий тип, потім нове ім'я.
- Чотири причини використання typedef
- Читабельність:
testScore_t GradeTest()протиint GradeTest(). - Підтримка: зміна базового типу в одному місці.
- Кросплатформність:
int8_t,int16_t,uint32_tз<cstdint>. - Спрощення: складні типи (
std::map<std::string, std::vector<int>>).
- Читабельність:
- typedef і вказівники на функції
- Проблема:
bool (*compare)(int, int)— незрозумілий синтаксис. - Рішення:
typedef bool (*Comparator)(int, int);. - Зв'язок із попередньою статтею про вказівники на функції.
- Проблема:
using— сучасний синтаксис (C++11)using seconds_t = double;— еквівалент typedef.- Чому
usingкращий: читабельніший порядок (псевдонім = тип). usingдля шаблонних псевдонімів (template aliases) — перевага перед typedef.
- Стандартні типи з
<cstdint>Тип Розмір Знак Опис int8_t8 біт Зі знаком Малий цілий uint8_t8 біт Без знаку Байт int16_t16 біт Зі знаком Короткий цілий uint32_t32 біт Без знаку Натуральний int64_t64 біт Зі знаком Великий цілий ptrdiff_t— Зі знаком Різниця вказівників size_t— Без знаку Розміри об'єктів - Поширені помилки та анти-патерни
- Надмірне використання псевдонімів: коли це шкодить читабельності.
- typedef в заголовковому файлі — правила включення.
typedefу глобальному просторі імен — ризики забруднення.
- Практика та резюме
- Рівень 1: Створити
using Meters = double; using Seconds = double;; написати функцію швидкості. - Рівень 1: Замінити всі
intу масиві ідентифікаторів наusing StudentID = uint32_t. - Рівень 2: Спростити вказівник на функцію з попередніх статей через
using. - Рівень 3: Розробити «шар абстракції платформи» — оголосити набір
using-псевдонімів, що перемикаються за допомогою#ifdefміжint32_tіint64_t.
- Рівень 1: Створити
Стаття 32 — Структури (struct)
Файл: 32.struct.mdОрієнтовний обсяг: 3 500–5 000 слів
Залежності: 05.data-types-variables.md, 15.pointers-basics.md, 19.dynamic-memory.md
Навчальні цілі
- Пояснити потребу в агрегуванні даних: проблема «Координата з трьох змінних».
- Навчити оголошувати
struct, ініціалізувати агрегатно. - Пояснити доступ до членів (
.та->). - Показати передачу структур у функції (за значенням vs за посиланням).
- Ввести поняття вкладених структур та масивів структур.
- Показати
structз методами (bridge до ООП).
Структура статті
- Вступ і Hook: Студент реалізує студента через
string name; int age; double gpa;. Три окремі змінні для одного поняття. Передати в функцію — три параметри. Масив студентів — три масиви. Рішення —struct. - Фундаментальні концепції
- Визначення: структура як агрегатний тип даних (aggregate type).
- Синтаксис оголошення
struct, члени-дані (data members), крапка з комою після}. - Різниця між оголошенням типу і визначенням змінної.
- Ініціалізація та агрегатна ініціалізація
- Агрегатна ініціалізація:
Student s = {"Alice", 20, 3.9}. - Ініціалізація за ім'ям члена (C++20 designated initializers):
Student s = {.name = "Alice"}. - Значення за замовчуванням у членах (default member initializers).
- Часткова ініціалізація — що отримує неініціалізований член.
- Агрегатна ініціалізація:
- Доступ до членів
- Оператор
.для об'єктів і посилань. - Оператор
->для вказівників (повторення з22.member-access-operator.md). ::debugger-viewдля візуалізації стану структури.
- Оператор
- Структури та пам'ять
- Розмір структури (
sizeof) та вирівнювання (alignment, padding). - Візуалізація через
::memory-view. __attribute__((packed))— коли і чому небезпечно.
- Розмір структури (
- Передача у функції
- Передача за значенням: копія, витрати на копіювання.
- Передача за константним посиланням
const Student&: рекомендований патерн. - Передача за вказівником: коли доречно.
- Повернення структури з функції, NRVO (Named Return Value Optimization).
- Масиви структур та вкладені структури
Student class_students[30];— масив структур.- Вкладена структура:
AddressвсерединіStudent. - Цикл
for-each по масиву структур.
- Структури з методами (перехідний місток до ООП)
- Функція-член всередині struct (
void print() const { ... }). - Структура з конструктором (попередній перегляд).
- Різниця
structтаclassу C++ (лише за замовчуванням видимості).
- Функція-член всередині struct (
- Практика та резюме
- Рівень 1: Оголосити
struct Point3D {double x, y, z;}; написати функцію відстані. - Рівень 1: Ініціалізувати масив
Color[8]та вивести таблицю RGB значень. - Рівень 2: Реалізувати
struct Matrix2x2з операціями множення. - Рівень 2: Написати
struct LinkedListNodeз вказівником на наступний вузол. - Рівень 3: Реалізувати систему обліку студентів:
struct Student,struct Course, функції пошуку, сортування та виведення звіту.
- Рівень 1: Оголосити
Стаття 33 — Об'єднання (union)
Файл: 33.union.mdОрієнтовний обсяг: 2 000–2 800 слів
Залежності: 32.struct.md, 05.data-types-variables.md
Навчальні цілі
- Пояснити семантику
union: один блок пам'яті, кілька інтерпретацій. - Показати, коли
unionкорисний: мережеві пакети, варіантні типи, рендерери. - Пояснити UB при зчитуванні не-активного члена.
- Ввести
std::variant(C++17) як безпечну альтернативу.
Структура статті
- Вступ і Hook: Уявімо сенсор, що може повертати або
float, або статусuint32_t. Як зберегти обидва варіанти без зайвих байтів? - Фундаментальні концепції
- Синтаксис
union, розмір дорівнює розміру найбільшого члена. - Активний член (active member): зміна одного членa змінює інтерпретацію пам'яті.
::memory-viewдля демонстрації перекриття байтів.
- Синтаксис
- Практичні застосування
- Мережеві пакети: доступ до байтів
uint32_t IP адресаякuint8_t[4]. - Floating-point хаки: читання бітів
floatчерезuint32_t. - Анонімні
unionу структурах.
- Мережеві пакети: доступ до байтів
- Undefined Behavior та правила
- Зчитування не-активного члена: UB у C++, але «common initial sequence» виключення.
unionз нетривіальними типами (конструктор/деструктор) — складнощі.
std::variantяк сучасна альтернатива- Синтаксис
std::variant<int, float, std::string>. std::get<>таstd::visit.- Чому перевагу надають variant у сучасному коді.
- Синтаксис
- Практика та резюме
- Рівень 1: Оголосити
union Dataзint i,float f; вивести їх байтові представлення. - Рівень 2: Реалізувати
union IPv4для зберігання IP-адреси як числа та байтів. - Рівень 3: Реалізувати
std::variant-based систему повідомлень для простого сокет-протоколу.
- Рівень 1: Оголосити
std::string_view: невласницький погляд на рядок без копіювання
Клас std::string_view (C++17): внутрішня модель {ptr, length}, створення з const char* та std::string, методи read-only доступу, remove_prefix/remove_suffix, відсутність нуль-термінатора. Dangling view — найнебезпечніша пастка. Коли обирати string_view, а коли const std::string&.
Вступ до подій браузера