Константные данные

В С++ можно сделать так, чтобы значение переменной было неизменяемым. Делается это с помощью ключевого слова 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?

На это есть несколько весомых причин:

  1. При помощи констант повышается читаемость кода - сразу понятно, что мы сравниваем номер дня с количеством дней в году
  2. Если мы решим поменять значение константы (для нашего примера - если мы, например, захотим сделать программу для лунного календаря), то нам нужно будет его поменять только в одном месте (в месте инициализации переменной), а не во всех местах, где используется это значение.
  3. Зачастую константные значения банально неудобно много раз писать - если это, например, длинная строчка или большое число.
  4. Если мы ошибимся в написании имени константной переменной, компилятор сразу же поправит нас, но если мы вместо одного числа случайно напишем другое (то же самое касается и строк/символов), то компилятор не сможет определить эту ошибку.

Если использование строк или символов напрямую ещё не так плохо, то использование напрямую чисел уже может вызвать проблемы при чтении и отладке кода.

Наиболее наглядно можно увидеть эту проблему на таком коде:

draw(2, 320, 240, 3, 7);

Происходит вызов функции draw с абсолютно непонятными параметрами - понять, что реально происходит в этом коде, достаточно сложно.

Такие заданные напрямую целочисленные литералы или литералы с плавающей точкой называют магическими числами.

И глобальное правило написания хорошего кода можно выразить так: в коде вообще не должно быть никаких магических чисел; единственное исключения составляет число 0, и иногда 1.

Механизм работы const

Стоит понимать, что из себя по факту представляет ключевое слово const.

const - это просто подсказка для компилятора. Когда мы обозначаем переменную через const, мы просим компилятор проследить, чтобы никто не менял эту переменную, и всё.

Константность переменной никак не отражается на выходном коде.

Источники