Константы

Константы — это переменные, значения в которых не должны изменяться во время работы программы. В более широком смысле под константой понимают любое значение, которое нельзя изменить, например, 10, 12.5, 'W', "string".

При объявлении константы перед типом данных указывается ключевое слово const:

const int MY_CONST = 10;
std::cout << MY_CONST << std::endl; // 10

Обратите внимание на то, что в названии константы принято использовать буквы только в верхнем регистре. Если название константы состоит из нескольких слов, то между словами указывается символ подчеркивания. Это позволяет отличить внутри программы константу от обычной переменной. После объявления константы, ее можно использовать в выражениях:

const int MY_CONST = 10;
int y;
y = MY_CONST + 20;

Присвоить значение константе можно только при объявлении. Любая попытка изменения значения в программе приведет к ошибке при компиляции:

error: assignment of read-only variable 'MY_CONST'

Создать константу можно также с помощью директивы #define. Значение, указанное в этой директиве, подставляется в выражение до компиляции. Название, указанное в директиве #define, принято называть макроопределением или макросом. Директива имеет следующий формат:

#define <Название макроса> <Значение>

Пример использования директивы #define приведен в листинге 3.2.

Листинг 3.2. Использование директивы #define

#include <iostream>

#define MY_CONST (-5)

int main() {
   int y;
   y = MY_CONST + 20;
   std::cout << MY_CONST << std::endl; // -5
   std::cout << y << std::endl;        // 15
   return 0;
}

Обратите внимание на то, что оператор = не используется и в конце инструкции точка с запятой не указывается. Если точку с запятой указать, то значение вместе с ней будет вставлено в выражение. Например, если определить макрос так:

#define MY_CONST 5;

то после подстановки значения, инструкция

y = MY_CONST + 20;

будет выглядеть следующим образом:

y = 5; + 20;

Точка с запятой после цифры 5 является концом инструкции, поэтому переменной y будет присвоено значение 5, а не 25. Подобная ситуация приводит к ошибкам, которые трудно найти, так как в этом случае инструкция + 20; не возбуждает ошибку при компиляции.

В качестве значения макроса можно указать целое выражение, например:

#define MY_CONST 5 + 5

Это значение также может привести к недоразумениям. Никакого вычисления выражения не производится. Все выражение целиком подставляется вместо названия макроса. Если инструкция выглядит так:

y = MY_CONST * 20;

то после подстановки значения, инструкция примет следующий вид:

y = 5 + 5 * 20;

Приоритет оператора умножения выше приоритета оператора сложения, поэтому число 5 будет умножено на 20, а затем к результату прибавлено число 5. Таким образом, результат будет 105, а не 200, как это было бы при использовании константы:

const int MY_CONST = 5 + 5;
int y;
y = MY_CONST * 20; // 200

Чтобы избежать недоразумений, выражение (а также отрицательное значение) в директиве #define следует заключать в круглые скобки:

#define MY_CONST (5 + 5)

При подстановке инструкция будет выглядеть так:

y = (5 + 5) * 20;

Теперь мы получим число 200, а не 105, т. к. скобки меняют приоритет операторов.

В качестве значения макроса можно указать строку в кавычках:

#define ERR "Сообщение об ошибке"

При указании длинной строки следует учитывать, что определение макроса должно быть расположено на одной строке. Если нужно разместить значение на нескольких строках, то в конце строки необходимо добавить обратную косую черту. После косой черты не должно быть никаких символов, в том числе и комментариев:

#define ERR "Сообщение об ошибке \
на нескольких \
строках"

В языке C++ существуют встроенные макросы (до и после названия два символа подчеркивания):

  • __FILE__ — имя файла;
  • __LINE__ — номер текущей строки;
  • __DATE__ — дата компиляции файла;
  • __TIME__ — время компиляции файла;
  • __VERSION__ — версия компилятора;
  • __cplusplus — используемый стандарт языка C++.

Помимо этих макросов существует множество других, объявленных в различных заголовочных файлах. Эти макросы мы рассмотрим в соответствующих разделах книги. Выведем текущие значения встроенных макросов (листинг 3.3).

Листинг 3.3. Встроенные макросы

#include <iostream>

int main() {
   std::cout << __LINE__ << std::endl;
   std::cout << __FILE__ << std::endl;
   std::cout << __DATE__ << std::endl;
   std::cout << __TIME__ << std::endl;
   std::cout << __cplusplus << std::endl;
   std::cout << __VERSION__ << std::endl;
   return 0;
}

Примерный результат выполнения:

4
..\src\Test64.cpp
Feb 28 2019
23:48:18
201402
8.2.1 20181214

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов