Перейти до вмісту

C++/Основи/Константи

Матеріал з Вікіпідручника
< C++

Константи

[ред.]

C++. Якщо змінна оголошена з ключовим словом const, це означає, що її значення не повинне змінюватись.

const int j = 13; // Константа типу int 
j = 45; // Помилка. Не можна змінювати значення
const int i; // Помилка. відсутнє початкове значення константи.

Константу можна визначити ще і традиційним способом, за допомогою директиви #define, наприклад:

#define five 5

Визначення констант за допомогою const і #define не є еквівалентними. Перший спосіб визначає змінну, яка займає деяку область пам'яті, а другий спосіб - макрос. Зверніть увагу, що константа five не має ніякого конкретного типу (int, char, і т.д.). Директива #define виконує просту текстову заміну. Кожен раз, коли препроцесор зустрічає слово five, він замінює його літералом 5. Оскільки препроцесор запускається перед компілятором, останній ніколи не дізнається про цю константу, а буде бачити лише число 5.

Константи в перерахуваннях

[ред.]

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

class Foo {
public:
enum Status { kOpen = 1, kClosed };
};

// Десь у програмі
Foo::Status s = Foo::kOpen;

Зверніть увагу — область дії повинна бути явно вказана як в імені типу, так і в символічному імені. Отже, символічні імена kOpen і kClosed можна використовувати в програмі без великої ймовірності, що такі імена повторяться. Компілятор розглядає символічні імена перерахувань як макроси, а не як константні змінні.

Вказівник на константу

[ред.]

При роботі з вказівниками на константу, слід враховувати два значення: адресу і вміст пам'яті по цій адресі. При створені вказівника на константу, адреса, що зберігається в вказівнику може змінюватися, але вміст пам'яті по цьому адресу - ні. Приклад:

const int* p; // Вказівник на константу
int i = 17;
p = &i; 
*p = 29; // Помилка

Константний вказівник

[ред.]

З константними вказівниками все навпаки: адресу змінювати не можна, але можна змінювати вміст пам'яті за цією адресою.

int i = 17;
int j = 29;
int* const p; // Помилка! Необхідно задати початкове значення
int* const p1 = &i; 
*p1 = 29; 
p1 = &j; //Помилка

Константний вказівник на константу

[ред.]

Це незмінна адреса незмінної величини.

int i = 17;
int j = 29;
const int* const p; // Помилка
const int* const p1 = &i; // Можна
*p1 = 29; // Помилка
p1 = &j; // Помилка