×
Traktatov.net » Язык программирования C++. Пятое издание » Читать онлайн
Страница 50 из 714 Настройки
. Тип >const int преобразуется в тип >bool тем же способом, что и обычный тип >int, и т.д.

К операциям, не изменяющим значение объекта, относится инициализация. При использовании объекта для инициализации другого объекта не имеет значения, один или оба из них являются константами.

>int i = 42;

>const int ci = i; // ok: значение i копируется в ci

>int j = ci;       // ok: значение ci копируется в j

Хотя переменная >ci имеет тип >const int, ее значение имеет тип >int. Константность переменной >ci имеет значение только для операций, которые могли бы изменить ее значение. При копировании переменной >ci для инициализации переменной >j ее константность не имеет значения. Копирование объекта не изменяет его. Как только копия сделана, у нового объекта нет никакой дальнейшей связи с исходным объектом.

По умолчанию константные объекты локальны для файла

Когда константный объект инициализируется константой во время компиляции, такой как >bufSize в определении ниже, компилятор обычно заменяет используемую переменную ее значением во время компиляции.

>const int bufSize = 512; // размер буфера ввода

Таким образом, компилятор создаст исполняемый код, использующий значение >512 в тех местах, где исходный код использует переменную >bufSize.

Чтобы заменить переменную значением, компилятор должен видеть ее инициализатор. При разделении программы на несколько файлов, в каждом из которых используется константа, необходим доступ к ее инициализатору. Для этого переменная должна быть определена в каждом файле, в котором используется ее значение (см. раздел 2.2.2). Для обеспечения такого поведения, но все же без повторных определений той же переменной, константные переменные определяются как локальные для файла. Определение константы с тем же именем в нескольких файлах подобно написанию определения для отдельных переменных в каждом файле.

Иногда константу необходимо совместно использовать в нескольких файлах, однако ее инициализатор не является константным выражением. Мы не хотим, чтобы компилятор создал отдельную переменную в каждом файле, константный объект должен вести себя как другие (не константные) переменные. В таком случае определить константу следует в одном файле, и объявить ее в других файлах, где она тоже используется.

Для определения единого экземпляра константной переменной используется ключевое слово >extern как в ее определении, так и в ее объявлениях.

>// Файл file_1.cc. Определение и инициализация константы, которая

>// доступна для других файлов

>extern const int bufSize = fcn();

>// Файл file_1.h

>extern const int bufSize; // та же bufSize, определенная в file_1.cc

Здесь переменная >bufSize определяется и инициализируется в файле >file_1.cc. Поскольку это объявление включает инициализатор, оно (как обычно) является и определением. Но поскольку >bufSize константа, необходимо применить ключевое слово >extern, чтобы использовать ее в других файлах.

Объявление в заголовке >file_1.h также использует ключевое слово >extern. В данном случае это демонстрирует, что имя >bufSize не является локальным для этого файла и что его определение находится в другом месте.