Константные данные
В С++ можно сделать так, чтобы значение переменной было неизменяемым. Делается это с помощью ключевого слова const
.
Как и в случае с auto
, такая переменная должна быть инициализирована сразу же при объявлении.
Пример
Предположим, в нашей программе пользователь выбирает один день в году, и нам нужно определить корректность введённых данных. А так же предположим, чтобы не возиться с ненужными деталями, что в нашем прекрасном мире не существует високосных годов:
int main()
{
const unsigned short days_in_year = 365;
std::cout << "Enter number of a day in the year\n";
int day; std::cin >> day;
if (day < 1 || day > days_in_year)
{
std::cout << "Invalid day\n";
return 1;
}
// какой-то код далее
}
Здесь мы определили переменную days_of_year
, и сделали её константной. Это логично, ведь количество дней в году - это число, которое точно не поменяется во время выполнения программы, и было бы неприятно, если бы кто-то это значение случайно поменял.
Почему использовать литералы напрямую - плохо
В этом примере можно бы было сказать: а зачем нам вообще использовать какую-то константную переменную? Почему бы просто сразу не написать 365
?
На это есть несколько весомых причин:
- При помощи констант повышается читаемость кода - сразу понятно, что мы сравниваем номер дня с количеством дней в году
- Если мы решим поменять значение константы (для нашего примера - если мы, например, захотим сделать программу для лунного календаря), то нам нужно будет его поменять только в одном месте (в месте инициализации переменной), а не во всех местах, где используется это значение.
- Зачастую константные значения банально неудобно много раз писать - если это, например, длинная строчка или большое число.
- Если мы ошибимся в написании имени константной переменной, компилятор сразу же поправит нас, но если мы вместо одного числа случайно напишем другое (то же самое касается и строк/символов), то компилятор не сможет определить эту ошибку.
Если использование строк или символов напрямую ещё не так плохо, то использование напрямую чисел уже может вызвать проблемы при чтении и отладке кода.
Наиболее наглядно можно увидеть эту проблему на таком коде:
draw(2, 320, 240, 3, 7);
Происходит вызов функции draw
с абсолютно непонятными параметрами - понять, что реально происходит в этом коде, достаточно сложно.
Такие заданные напрямую целочисленные литералы или литералы с плавающей точкой называют магическими числами.
И глобальное правило написания хорошего кода можно выразить так: в коде вообще не должно быть никаких магических чисел; единственное исключения составляет число 0
, и иногда 1
.
Механизм работы const
Стоит понимать, что из себя по факту представляет ключевое слово const
.
const
- это просто подсказка для компилятора. Когда мы обозначаем переменную через const
, мы просим компилятор проследить, чтобы никто не менял эту переменную, и всё.
Константность переменной никак не отражается на выходном коде.