Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
8
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

9.1. Специфікатори типів даних

Специфікатори типів даних const і volatile керують доступом до змінної.

У мові програмування C++ визначено два специфікатори типів даних – const і volatile, котрі роблять вплив на те, як можна отримати доступ до змінних або модифікувати їх. Офіційно їх іменують cv-специфікаторами і вони мають передувати базовому типу під час оголошення змінної.

9.1.1. Застосування специфікатора типу даних const

Змінні, які оголошено з використанням специфікатора типу даних const, не можуть змінити свої значення у процесі виконання програми. Проте будь-якій const-змінній можна присвоїти деяке початкове значення. Наприклад, у процесі виконання такої настанови

const double vzm = 3.2;

створюється double-змінна vzm, яка містить значення 3.2, і це значення у процесі виконання програми змінити вже не можна. Але цю змінну можна використовувати в інших виразах. Будь-яка const-змінна набуває значення або під час ініціалізації, що задається безпосередньо, або під час використання апаратно-залежних засобів. Застосування специфікатора типу даних const до оголошення змінної гарантує, що вона не буде модифікована іншими частинами Вашої про­грами.

Специфікатор типу даних const запобігає модифікації змінної у процесі виконання програми.

Специфікатор типу даних const має ряд важливих застосувань. Можливо, частіше за все його використовують для створення const-параметрів типу покажчика. Такий параметр-по­каж­чик захищає об'єкт, на який він посилається, від модифікації з боку функції. Іншими словами, якщо параметр-покажчик передує ключовому слову const, то ніяка настанова цієї функції не може модифікувати змінну, яка адресується цим параметром. Наприклад, функція code() у наведеній нижче короткій програмі зсовує кожну букву в повідомленні на одну алфавітну позицію (тобто замість букви "А" ставиться буква "Б" і т.д.), відображаючи таким чином повідомлення в закодованому вигляді. Використання специфікатора типу даних const в оголошенні параметра не дає змоги коду функції модифікувати об'єкт, на який вказує цей параметр.

Код програми 9.1. Демонстрація зсуву букв у повідомленні на одну алфавітну позицію

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

void code(const char *str);

int main()

{

code("Це тест."); // Зсув букви на одну алфавітну позицію

getch(); return 0;

}

/* Використання специфікатора типу даних const гарантує, що str

не може змінити аргумент, на який він вказує. */

void code(const char *str)

{

while(*str) {

cout << (char) (*str+1);

str++;

}

}

Оскільки параметр str оголошується як const-покажчик, то у функції code() немає ніякої можливості внести зміни в рядок, яка адресується покажчиком str. Але, якщо Ви спробуєте написати функцію code() так, як це показано в наведеному нижче прикладі, то обов'язково отримаєте повідомлення про помилку і програма не скомпілюється.

// Демонстрація неправильного коду програми

void code(const char *str)

{

while(*str) {

*str = *str + 1; // Помилка, аргумент модифікувати не можна

cout << (char) *str;

str++;

}

}

Оскільки параметр str є const-покажчиком, то його не можна використовувати для модифікації об'єкта, на який він посилається.

Специфікатор типу даних const можна також використовувати для посилальних параметрів, щоб не допустити у функції модифікацію змінних, на які посилаються ці параметри. Наприклад, наведений нижче код програми є некоректним, оскільки функція fun() намагається модифікувати змінну, на яку посилається параметр izm.

Код програми 9.2. Демонстрація неможливості модифікувати const-посилання

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

void fun(const int &izm);

int main()

{

int kzm = 10;

fun(kzm);

getch(); return 0;

}

// Використання посилального const-параметра.

void fun(const int &izm)

{

izm = 100; // Помилка, не можна модифікувати const-посилання.

cout << izm;

}

Специфікатор типу даних const ще можна використовувати для підтвердження того, що Ваша програма не змінює значення певної змінної. Пригадайте, що змінна типу const може бути модифікована зовнішніми пристроями, тобто її значення може бути встановлено будь-яким апаратним пристроєм (наприклад, давачем). Оголосивши змінну за допомогою специфікатора типу даних const, можна довести, що будь-які зміни, яким піддається ця змінна, викликані виключно зовнішніми діями.

Нарешті, специфікатор типу даних const використовують для створення іменованих констант. Часто у програмах багато разів застосовується одне і те саме значення для різних потреб. Наприклад, необхідно оголосити декілька різних масивів так, щоб всі вони мали однаковий розмір. Коли потрібно використовувати таке "магічне число", то є сенс реалізувати його у вигляді const-змінної. Потім замість реального значення можна використовувати ім'я цієї змінної, а якщо це значення доведеться згодом змінити, то Ви зміните його тільки в одному місці програми. Наведений нижче код програми дає змогу реалізувати цей вид застосування специфікатора типу даних const "на смак".

// Використання специфікатора типу даних const

// для створення іменованих констант

#include <iostream> // Для потокового введення-виведення

using namespace std; // Використання стандартного простору імен

const int size = 10;

int main()

{

int A1[size], A2[size], A3[size];

//...

}

Якщо у наведеному прикладі знадобиться використовувати новий розмір для масивів, то Вам потрібно буде змінити тільки оголошення змінної size і перекомпілювати програму. Як наслідок, всі три масиви автоматично отримають новий розмір.