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; // Помилка