Починаючи з C++14 (у функціях лише зі стандарту C++20) ключове слово auto при ініціалізації змінної може використовуватися замість типу змінної, щоб повідомити компілятору, що він має визначити тип змінної на основі значення, яке їй присвоюється.
Коли змінній присвоюється значення після її оголошення (не в момент оголошення), це називається копіювальним присвоєнням (або просто «присвоєнням»):
int nValue;
nValue = 5; // копіювальне присвоєння
Пряма або копіювальна ініціалізація працює не з усіма типами даних (наприклад, ви не зможете використати ці способи для ініціалізації списку значень).
Щоб забезпечити єдиний механізм ініціалізації, який працює з усіма типами даних, у C++11 було додано новий спосіб ініціалізації, який називається уніфікованою ініціалізацією (uniform-ініціалізацією):
int value{5};Ініціалізація змінної з порожніми фігурними дужками означає ініціалізацію за замовчуванням (змінній присвоюється 0):
int value{}; // ініціалізація змінної за замовчуванням значенням 0 (нуль)
У уніфікованої ініціалізації є ще одна перевага: ви не зможете присвоїти змінній значення, яке не відповідає її типу даних — компілятор видасть попередження або повідомлення про помилку. Наприклад:
int value{4.5}; // помилка: цілочисельна змінна не може містити нецілочисельні значення
Правило: Використовуйте уніфіковану ініціалізацію.
Дано двовимірний масив цілих чисел. Вставте в нього рядок із чисел 10 перед рядком з номером t.
#include <iostream>
#include <ctime>
using namespace std;
const int maxM = 10; // Максимальна кількість рядків
const int maxN = 10; // Максимальна кількість стовпців
// Прототипи функцій
void printMatrix(int[][maxN], int, int); // Вивід матриці
void randomizeMatrix(int[][maxN], int, int, int, int); // Заповнення матриці випадковими числами
void InsertRow(int[][maxN], int&, int, int, int*); // Вставка рядка
int main() {
srand(time(0)); // Ініціалізація генератора випадкових чисел
int arr[maxM][maxN]; // Оголошення матриці
int M = 5, N = 5; // Початкові розміри
// Введення розмірів матриці
cout << "Введіть розміри матриці (рядки стовпці):" << endl;
cin >> M >> N;
// Введення діапазону значень
int minRand = 0, maxRand = 9;
cout << "Введіть діапазон значень елементів матриці (min max):" << endl;
cin >> minRand >> maxRand;
// Заповнення та вивід матриці
randomizeMatrix(arr, M, N, minRand, maxRand);
printMatrix(arr, M, N);
cout << endl;
// Введення номера рядка для вставки
int k;
cout << endl << "Введіть номер рядка для вставки:" << endl;
cin >> k;
// Створення рядка для вставки
int s[maxM];
for (int i = 0; i < N; i++) s[i] = 10; // Заповнюємо рядок значеннями 10
// Вставка рядка або повідомлення про помилку
if (k >= 0 && k < M) {
InsertRow(arr, M, N, k, s);
} else {
cout << "Помилка в даних. Невірний номер рядка." << endl;
}
// Вивід оновленої матриці
cout << endl;
printMatrix(arr, M, N);
return 0;
}
// Функція виводу матриці
void printMatrix(int matrix[][maxN], int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
}
// Функція заповнення матриці випадковими числами
void randomizeMatrix(int matrix[][maxN], int rows, int cols, int minVal, int maxVal) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = rand() % (maxVal - minVal + 1) + minVal;
}
}
}
// Функція вставки рядка
void InsertRow(int matrix[][maxN], int& rows, int cols, int rowNum, int* newRow) {
// Зсув рядків вниз
for (int i = rows; i > rowNum; i--) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = matrix[i-1][j];
}
}
// Вставка нового рядка
for (int j = 0; j < cols; j++) {
matrix[rowNum][j] = newRow[j];
}
rows++; // Збільшення кількості рядків
}
