Для успішної здачі екзамену з C++ важливо мати чітке розуміння основних тем та концепцій мови програмування. Тут ви знайдете популярні запитання з короткими та змістовними відповідями, що допоможуть вам швидко підготуватися та впевнено скласти іспит.
1. Стандартні типи даних, класифікація типів. Структура програми.
Стандартні типи даних у C++ містять int
, float
, double
, char
, bool
. Структура програми складається з заголовків бібліотек, функцій, оголошень змінних та основної частини коду.
2. Введення і виведення даних.
Для введення даних використовують cin
, а для виведення — cout
. Дані вводяться за допомогою оператора >>
, а виводяться через оператор <<
.
3. Арифметичні операції. Перетворення типів, перетворення даних у виразах.
Арифметичні операції охоплюють додавання, віднімання, множення, ділення та залишок. Перетворення типів відбувається через явне або неявне приведення типів у виразах.
4. Логічні вирази. Операції відношення та логічні операції.
Логічні вирази використовують операції &&
(AND), ||
(OR), !
(NOT). Операції відношення містять ==
, !=
, <
, >
, <=
, >=
.
5. Опис вказівки розгалуження. Повна форма вказівки розгалуження. Складена вказівка. Скорочена форма вказівки розгалуження.
Вказівка if
дозволяє виконати блок коду, якщо умова істинна. Повна форма: if (умова) {оператори} else {оператори}
; складена форма: if (умова) операція;
.
6. Перемикач.
Перемикач (switch
) дозволяє вибирати одну з можливих гілок виконання в залежності від значення виразу. Використовується з case
для кожної умови та break
для виходу.
7. Вказівка повторення з параметром (For – to – do).
Цикл for
використовується для виконання блоку коду кілька разів з певним кроком. Формат: for (ініціалізація; умова; крок)
.
8. Вказівка повторення з предумовою (Цикл – While).
Цикл while
виконується, поки умова є істинною. Формат: while (умова) {оператори}
.
9. Вказівка повторення з післяумовою (Цикл Do..while).
Цикл do..while
спочатку виконує код, а потім перевіряє умову. Формат: do {оператори} while (умова);
.
10. Одновимірні масиви. Опис, характерні властивості. Введення і виведення елементів одновимірного масиву.
Одновимірний масив — це набір елементів одного типу, доступ до яких здійснюється через індекс. Введення та виведення елементів здійснюється через цикли або індекси, наприклад, arr[0]
.
11. Знаходження суми елементів одновимірного масиву. Знаходження середнього арифметичного елементів масиву.
Для знаходження суми елементів масиву використовується цикл для підсумовування всіх елементів. Середнє арифметичне обчислюється як сума елементів, поділена на кількість елементів.
int sum = 0;
for (int i = 0; i < n; i++) sum += arr[i];
double average = sum / n;
12. Пошук мінімального та максимального елементів в одновимірному масиві.
Мінімальний та максимальний елементи знаходяться шляхом порівняння кожного елемента масиву з поточними мінімумом та максимумом.
int min = arr[0], max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] < min) min = arr[i];
if (arr[i] > max) max = arr[i];
}
13. Впорядкування елементів одновимірного масиву. «Метод бульбашки».
Метод бульбашки полягає у порівнянні сусідніх елементів та їх обміні місцями, якщо вони в неправильному порядку. Цей процес повторюється до тих пір, поки масив не буде відсортований.
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) swap(arr[j], arr[j+1]);
}
}
14. Впорядкування елементів одновимірного масиву методом вибору мінімального елемента.
Метод вибору мінімального елемента полягає у знаходженні найменшого елемента в масиві і поміщенні його в початок масиву, після чого процес повторюється для решти елементів.
for (int i = 0; i < n-1; i++) {
int minIndex = i;
for (int j = i+1; j < n; j++) {
if (arr[j] < arr[minIndex]) minIndex = j;
}
swap(arr[i], arr[minIndex]);
}
15. Багатомірні масиви. Опис, характерні властивості. Введення і виведення елементів двовимірного масиву.
Багатомірні масиви в C++ є масивами масивів. Двовимірний масив можна уявити як таблицю з рядками та стовпцями, доступ до елементів здійснюється через два індекси.
int arr[3][3];
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
cin >> arr[i][j];
16. Знаходження суми елементів двовимірного масиву. Знаходження середнього арифметичного елементів масиву.
Для обчислення суми елементів двовимірного масиву використовують вкладені цикли, а середнє арифметичне знаходиться шляхом ділення суми на загальну кількість елементів.
int sum = 0;
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
sum += arr[i][j];
double average = sum / (rows * cols);
17. Пошук мінімального та максимального елементів в двовимірному масиві.
Мінімальні та максимальні елементи двовимірного масиву знаходяться за допомогою порівнянь усіх елементів в обох вимірах.
int min = arr[0][0], max = arr[0][0];
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++) {
if (arr[i][j] < min) min = arr[i][j];
if (arr[i][j] > max) max = arr[i][j];
}
18. Рядки. Визначення рядкової змінної. Способи запису рядка в масив.
Рядки в C++ визначаються як масиви символів або за допомогою типу string
. Масиви символів можна ініціалізувати з літералів або через індекси.
char str[50] = "Hello";
string s = "World";
19. Копіювання і конкатенація рядків. Порівняння рядків. Перетворення рядків.
Рядки копіюються через функцію strcpy()
або операції з string
. Конкатенація здійснюється через оператор +
. Порівняння рядків проводиться через ==
або функцію strcmp()
.
string str1 = "Hello", str2 = " World";
string str3 = str1 + str2; // Конкатенація

20. Звертання рядків. Пошук символів. Пошук підрядків.
Для звертання рядка використовують індекси, а для пошуку символів — метод find()
.
string str = "Hello";
size_t found = str.find('e'); // Пошук символу 'e'
21. Опис структури. Доступ до полів структури. Ініціалізація полів структури. Присвоювання структурних змінних.
Структури дозволяють об’єднувати різні типи даних. Доступ до полів здійснюється через точку, а ініціалізація — у момент оголошення або за допомогою конструктора.
struct Person {
string name;
int age;
};
Person p = {"Alice", 30};
cout << p.name;
22.Вкладені структури. Ініціалізація полів вкладеної структури.
Вкладені структури — це структури, що містять інші структури. Ініціалізація полів здійснюється через доступ до внутрішніх елементів через точку.
struct Address {
string city;
string street;
};
struct Person {
string name;
Address address;
};
Person p = {"Alice", {"Kyiv", "Shevchenka 1"}};
23. Масиви структур. Ініціалізація масиву структур.
Масиви структур використовуються для зберігання множини структур. Ініціалізація здійснюється через списки ініціалізації.
Person people[3] = {{"Alice", 30}, {"Bob", 25}, {"Charlie", 28}};
24. Операція одержання адреси &. Поняття покажчика. Рознайменування покажчиків.
Оператор &
отримує адресу змінної, а покажчик — це змінна, яка зберігає адресу іншої змінної. Покажчики можуть бути рознайменовані для зручності.
int x = 10;
int* ptr = &x;
25. Ініціалізація покажчиків. Доступ до перемінної по покажчику.
Покажчики ініціалізуються через оператор &
, а доступ до значення здійснюється через оператор *
.
int x = 10;
int* ptr = &x;
cout << *ptr; // Виведе 10
26. Виділення пам’яті за допомогою оператора new. Вивільнення пам’яті за допомогою оператора delete.
Оператор new
виділяє динамічну пам’ять для змінних або масивів, а оператор delete
звільняє пам’ять. Для масивів використовують delete[]
для звільнення пам’яті.
int* ptr = new int; // Виділення пам'яті
delete ptr; // Вивільнення пам'яті
27. Арифметика покажчиків. Застосування до покажчиків оператора sizeof
.
Арифметика покажчиків дозволяє змінювати адресу, додаючи чи віднімаючи числа, а оператор sizeof
повертає розмір типу або об’єкта в байтах.
int* ptr; ptr++; cout << sizeof(ptr); // Виведе розмір покажчика на int
28. Створення одновимірних динамічних масивів. Для створення одновимірного динамічного масиву використовуютьnew
з вказівкою кількості елементів.
int* arr = new int[10]; // Одновимірний динамічний масив
delete[] arr; // Вивільнення пам'яті
29. Створення двовимірних динамічних масивів.
Двовимірні масиви створюються за допомогою масиву покажчиків або через динамічне виділення пам’яті для кожного рядка.
int** arr = new int*[5];
for (int i = 0; i < 5; i++) {
arr[i] = new int[10];
}
delete[] arr; // Вивільнення пам'яті
30. Створення динамічних рядків.
Для створення динамічних рядків використовують тип char*
або string
в поєднанні з оператором new
.
char* str = new char[100]; // Динамічний рядок
delete[] str; // Вивільнення пам'яті
31. Створення динамічних структур.
Структури також можна динамічно створювати через оператор new
.
struct Person {
string name;
int age;
};
Person* p = new Person; // Динамічне створення структури
delete p; // Вивільнення пам'яті
32. Функції. Визначення функцій. Створення прототипів і виклик функцій. Функції без параметрів. Функції, що не повертають значення.
Функція визначається через тип повернення, ім'я та параметри. Функції без параметрів використовують порожні дужки, а функції, що не повертають значення, мають типvoid
.
void printMessage() {
cout << "Hello!";
}
printMessage(); // Виклик функції
33. Аргументи функції і передача за значенням.
Аргументи функцій передаються за значенням за замовчуванням, що означає, що копії значень змінюються, а оригінальні дані залишаються незмінними.
void changeValue(int x) {
x = 10;
}
34. Аргументи за замовчуванням.
Аргументи функцій можуть мати значення за замовчуванням, якщо вони не були передані під час виклику.
void func(int x = 5) { cout << x; }
func(); // Виведе 5
35. Передача масивів як аргументи функцій.
Масиви передаються у функцію як покажчики, тому зміни в масиві в функції впливають на оригінальний масив.
void modifyArray(int arr[], int n) {
arr[0] = 100;
}
36. Передача рядків як аргументи функцій.
Рядки можна передавати як аргументи за допомогою типу string
або як масиви символів.
void printString(string str) {
cout << str;
}
37. Функції, що повертають рядки.
Функції можуть повертати тип string
або масив символів. Для цього необхідно правильно ініціалізувати рядок.
string getGreeting() {
return "Hello!";
}
38. Передача структур як аргументи функцій.
Структури передаються як аргументи за значенням або за посиланням. Передача за посиланням дозволяє змінювати значення полів структури.
void printPerson(Person& p) {
cout << p.name;
}
39. Посилання. Властивості й особливості посилань. Передача параметрів по посиланню.
Посилання є альтернативою покажчикам і дозволяють змінювати значення змінної без використання оператора *
. Передача параметрів по посиланню дає доступ до оригінальних даних.
void modifyValue(int& x) {
x = 10;
}

40. Перевантаження функцій і неоднозначність.
Перевантаження функцій дозволяє визначати кілька функцій з однаковими іменами, але з різними параметрами. Неоднозначність виникає, коли компілятор не може визначити, яку функцію викликати через схожість параметрів.
void func(int x);
void func(double x);
41. Шаблони функцій.
Шаблони функцій дозволяють створювати універсальні функції для різних типів даних, де типи визначаються під час виклику.
template <typename T>
T add(T a, T b) {
return a + b;
}
42. Шаблони, що перевантажуються.
Шаблони можна перевантажувати, визначаючи різні шаблони для різних типів аргументів. Це дозволяє використовувати одну назву для функцій з різною поведінкою.
template <typename T>
void func(T a);
template <typename T>
void func(T* a);
43. Спеціалізація шаблонів.
Спеціалізація шаблону дозволяє визначити конкретну реалізацію шаблону для певного типу даних.
template <>
int add<int>(int a, int b) {
return a + b;
}
44. Класи. Основи поняття класу. Загальний формат оголошення класу. Доступ до членів класу. Опис об’єктів.
Клас визначає тип даних, який містить як змінні (члени), так і методи для роботи з ними. До членів класу можна звертатися через об’єкти класу, якщо доступ до них дозволено.
class MyClass {
public:
int x;
void setX(int val) { x = val; }
};
MyClass obj;
obj.setX(5);
45. Конструктори і деструктори. Список ініціалізації елементів.
Конструктори ініціалізують об’єкти, а деструктори — звільняють ресурси. Список ініціалізації дозволяє ініціалізувати члени класу перед виконанням тіла конструктора.
class MyClass {
public:
int x;
MyClass(int val) : x(val) {}
~MyClass() {}
};
46. Конструктори за замовчуванням.
Конструктор за замовчуванням не приймає аргументів і викликається при створенні об’єкта без передачі параметрів.
class MyClass {
public:
MyClass() { x = 0; }
};
47. Конструктори копіювання.
Конструктор копіювання дозволяє створювати новий об’єкт як копію існуючого.
MyClass(const MyClass& obj) { x = obj.x; }
48. Статичні члени класу.
Статичні члени належать класу, а не його об’єктам, і доступ до них здійснюється через ім’я класу.
class MyClass {
public:
static int count;
};
MyClass::count = 10;
49. Об’єкти як аргументи функцій. Об’єкти, що повертаються функціями.
Об’єкти можуть передаватися у функції або повертатися з функцій за допомогою посилань або вказівників.
void modifyObject(MyClass& obj) { obj.setX(10); }
MyClass createObject() { return MyClass(5); }
50. Покажчик this
.this
— це покажчик на поточний об’єкт класу, який дає доступ до його членів та методів.
class MyClass {
public:
void print() { cout << this->x; }
};
51. Масиви об’єктів класу. Ініціалізація масивів об’єктів.
Масиви об’єктів класу можна ініціалізувати в стандартний спосіб, використовуючи списки ініціалізації.
MyClass arr[5];
52. Абстрактні типи даних. Створення абстрактного типу даних «стік». Ключове слово typedef
.
Абстрактний тип даних (ADT) визначає набір операцій без деталізованої реалізації. typedef
дозволяє створювати нові імена для типів.
typedef int Stack;
53. Дружні функції.
Дружні функції мають доступ до приватних і захищених членів класу, навіть якщо вони не є його членами.
class MyClass {
private:
int x;
public:
friend void modify(MyClass& obj);
};
54. Основи перевантаження операцій. Обмеження на перевантаження операцій.
Операції можуть бути перевантажені, якщо вони мають відповідні операнди, але деякі операції (наприклад, ::
, ?:
, тощо) не можна перевантажувати.
class MyClass {
public:
MyClass operator+(const MyClass& obj);
};
55. Перевантаження бінарних операцій.
Бінарні оператори, такі як +
, -
, *
, можуть бути перевантажені для визначення поведінки з об’єктами класу.
MyClass operator+(const MyClass& obj) {
return MyClass(this->x + obj.x);
}
56. Перевантаження операторів відносини і логічні оператори.
Оператори порівняння (==
, <
, >
) та логічні оператори можуть бути перевантажені для перевірки рівності або порядку між об’єктами.
bool operator==(const MyClass& obj) { return this->x == obj.x; }
57. Перевантаження оператора присвоювання.
Оператор присвоєння (=
) дозволяє присвоювати значення одному об’єкту класу з іншого.
MyClass& operator=(const MyClass& obj) {
if (this != &obj) {
this->x = obj.x;
}
return *this;
}
58. Перевантаження операторів інкремента і декремента.
Оператори інкремента (++
) та декремента (--
) можна перевантажити для зміни значень об’єктів.
MyClass& operator++() {
this->x++;
return *this;
}
59. Перевантаження операцій «помістити в потік» і «узяти з потоку».
Оператори <<
і >>
можуть бути перевантажені для введення та виведення об’єктів класу.
ostream& operator<<(ostream& os, const MyClass& obj) {
os << obj.x;
return os;
}
60. Функції перетворення типів.
Функції перетворення типів дозволяють явно або неявно змінювати типи змінних. Вони можуть бути реалізовані через функції або оператори в класах.
class MyClass {
public:
operator int() const { return x; }
};
61. Динамічні структури даних.
Динамічні структури даних дозволяють змінювати розмір під час виконання програми, використовуючи оператори new
та delete
. Це охоплює списки, стеки, черги тощо.
int* arr = new int[10];
delete[] arr;
62. Лінійні односпрямовані списки.
Односпрямований список — це структура даних, де елементи зв’язуються через покажчики і кожен елемент вказує лише на наступний.
struct Node {
int data;
Node* next;
};
63. Лінійні двонаправлені списки.
Двонаправлений список — це структура, де кожен елемент має два покажчики: один на наступний елемент, інший — на попередній.
struct Node {
int data;
Node* next;
Node* prev;
};
64. Стеки і черги.
Стек — це структура даних типу LIFO (останній зайшов — перший вийшов), а черга — це структура типу FIFO (перший зайшов — перший вийшов).
stack<int> s;
queue<int> q;
65. Потокові класи. Прапори форматування. Маніпулятори. Функції.
Потокові класи дозволяють працювати з введенням та виведенням даних через стандартні потоки (наприклад, cin
, cout
). Прапори форматування та маніпулятори допомагають контролювати вигляд виведення.
cout << fixed << setprecision(2) << 3.14159;
66. Визначені потокові об’єкти. Помилки потоків.
Потокові об’єкти визначаються для введення та виведення даних. Якщо під час операцій з потоком виникає помилка, потік переходить у стан помилки.
if (cin.fail()) {
cout << "Input error!" << endl;
}
67. Потокове введення/виведення файлів.
Потокове введення/виведення файлів використовує потоки для роботи з файлами, надаючи зручні методи для запису і зчитування даних.
ofstream file("output.txt");
ifstream fileIn("input.txt");
68. Файли послідовного доступу.
Файли послідовного доступу дозволяють читати або записувати дані в порядку їх збереження в файлі (без можливості доступу до конкретних місць файлу).
ofstream file("data.txt");
file << "Hello, world!";
69. Файли довільного доступу.
Файли довільного доступу дозволяють читати та записувати дані на довільних позиціях в файлі. Використовуються методи для роботи з позицією файлу, як-от seekg
та seekp
.
fstream file("data.bin", ios::in | ios::out | ios::binary);
file.seekg(10, ios::beg);
file.write(reinterpret_cast<char*>(&value), sizeof(value));