Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Програмування лекція 1.doc
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
138 Кб
Скачать
☆

Кваліфікатори const та volatile

Кваліфікатори const та volatile – кваліфікатори доступу та модифікації. Їх вказують перед модифікаторами типів та іменами типів, які вони уточнюють. Формальна їхня назва: cv-кваліфікатори (cv-qualifiers).

Змінні типу const не можуть змінюватися, проте їх можна ініціалізувати.

Використання:

const [модифікатор типу] тип ідентифікатор = значення;.

Наприклад:

const int x=2;.

Дане оголошення створює константу x та ініціалізує її значенням 2. Змінити її значення у подальшому не можна.

#include <iostream>

using namespace std;

int main()

{

const int a=1;

cout<<a<<endl;

// a=2; // операція помилкова,

// оскільки змінити значення константи не можна

return 0;

}

Кваліфікатор const можна використати для захисту об’єктів, які передають у функцію як аргументи. Якщо у функцію передають вказівник на об’єкт, то через вказівник можна змінити фактичне значення, на яке посилається вказівник. Але якщо вказівник уточнити кваліфікатором const, функція не зможе змінити значення, записане у відповідну комірку пам’яті.

#include <iostream>

using namespace std;

void f(const int *x)

{

cout << *x << endl;

}

int main()

{

int a=1;

f(&a);

return 0;

}

Багато функцій зі стандартної бібліотеки використовують кваліфікатор const в оголошеннях своїх параметрів. Наприклад, прототип функції strlen() виглядає так:

size_t strlen(const char *str);.

Оголосивши вказівник str константою, автори захистили від зміни рядок, на який він посилається.

Кваліфікатор const можна використовувати також для запобігання модифікації змінних. Змінна типу const може бути модифікована за межами програми, наприклад, за допомогою апаратних засобів.

Кваліфікатор volatile повідомляє компіляторові, що значення змінної може змінюватися неявно. Більшість компіляторів C/C++ автоматично оптимізують деякі вирази, вважаючи, що значення змінних не змінюються, якщо їх не вказано у лівій частині оператора присвоєння. Таким чином, немає потреби щоразу перевіряти їхні значення при використанні. Крім того, деякі компілятори змінюють порядок обчислення виразів у ході компіляції. Кваліфікатор volatile запобігає таким змінам.

Кваліфікатори const та volatile можна використовувати сумісно.

Специфікатори зберігання

Специфікатор extern

У мові C++ існують п’ять специфікаторів зберігання:

extern,

static,

register,

auto,

mutable.

Ці специфікатори повідомляють компілятор про те, як слід зберігати оголошену змінну. Загальний вигляд оголошення, який використовує такі спеціфікатори, наведено нижче:

специфікатор_зберігання тип ім’я змінної; .

У мовах C/C++ передбачено три категорії зв’язків: зовнішні, внутрішні та їх відсутність. Зазвичай, функції та глобальні змінні мають зовнішні зв’язки, вони доступні із довільної частини програми. Глобальні об’єкти, оголошені за допомогою специфікатора static, мають внутрішні зв’язки. Вони доступні тільки усередині файлу, у якому вони оголошені. Локальні змінні не мають зв’язків, тому видимі тільки усередині свого блоку.

Головне призначення специфікатора extern – вказати, що об’єкт, який оголошується, володіє зовнішніми зв’язками у межах всієї програми.

У програмі можуть бути декілька оголошень (declarations) однієї і тієї ж змінної і тільки одне визначення (definition). В оголошенні вказують ім’я і тип об’єкту, визначення ж виділяє пам’ять для нього.

У більшості випадків оголошення змінної одночасно є її визначенням. Проте, вказавши перед іменем змінної специфікатор extern, можна оголосити її, не визначаючи.

Таким чином, для того, щоб звернутися до змінної, оголошеної в іншій частині програми, змінну потрібно оголосити, скориставшись специфікатором extern.

У наступному прикладові змінну x визначено після функції main(). Специфікатор extern в оголошенні змінної x повідомляє компілятор про те, що змінна визначена в іншій частині програми, у даному випадкові – у кінці.

Специфікатор extern дозволяє оголосити змінну, не визначаючи її. Проте, якщо одночасно з оголошенням змінна ініціалізується, то відбувається визначення змінної.

int main()

{

extern int x; // глобальна змінна

cout << x << endl;

return 0;

}

// глобальне визначення змінної

int x=1;

Специфікатор extern відіграє важливу роль у програмах, що складаються із декількох файлів.

На практиці оголошення зовнішніх змінних зазвичай зберігають у заготовочних файлах, котрі включають у вихідний код.