Как вы уже знаете, в программах на Си++ переменные обязательно должны
быть описаны до первого использования, например, так:
float number;
После оператора описания до момента выполнения первого оператора при-
сваивания значение переменной "number" будет неопределенным, т.е. эта переменная
может иметь случайное значение. В Си++ можно (и желательно) инициализировать
переменные конкретными значениями непосредственно при описании переменных.
Например, возможен следующий оператор описания с инициализацией:
float PI = 3.1416;
Если значение переменной в программе никогда не изменяется, то ее целесооб-
разно защитить от случайного изменения с помощью служебного слова "const" – т.е.,
превратить в константу.
4.1 Тип "Перечисление"
Для описания набора связанных по смыслу констант типа "int" в Си++ есть
оператор перечисления. Например, описание вида
enum { MON, TUES, WED, THURS, FRI, SAT, SUN };
эквивалентно описанию 7 констант-кодов дней недели:
const int MON = 0;
const int TUES = 1;
const int WED = 2;
const int THURS = 3;
|
|
const int FRI = 4;
const int SAT = 5;
const int SUN = 6;
По умолчанию членам перечисления "enum" присваиваются значения 0, 1, 2, и
т.д.. При необходимости члены перечисления можно инициализировать другими зна-
чениями. Неинициализированным явно членам будут присвоены значения по поряд-
ку, начиная от предыдущего проинициализированного члена:
enum { MON = 1, TUES, WED, THURS, FRI, SAT = -1, SUN };
В приведенном примере "FRI" имеет значение 5, а "SUN" – значение 0.
25
4.2 Расположение описаний констант и переменных в исходном тексте
В исходном тексте описания констант чаще всего размещаются в заголовке
программы перед функцией "main". После них, уже в теле функции "main", размеща-
ются описания переменных. Для иллюстрации этого порядка ниже приведен фраг-
мент программы, которая рисует на экране окружность заданного радиуса и вычисля-
ет ее длину (набирать этот пример не надо, поскольку он приведен не полностью.)
#include <iostream.h>
const float PI = 3.1416;
const float SCREEN_WIDTH = 317.24;
int drawCircle(float diameter); /* Это "прототип функции" */
int main()
{
float radius = 0;
cout << "Введите радиус окружности.\n";
cin >> radius;
drawCircle(radius*2);
cout.setf(ios::fixed);
cout.precision(2);
cout << "Длина окружности радиуса " << radius;
cout << " примерно равна " << 2*PI*radius << ".\n";
return 0;
}
int drawCircle(float diameter)
{
float radius = 0;
if (diameter > SCREEN_WIDTH)
radius = SCREEN_WIDTH/2.0;
else
radius = diameter/2.0;
...
...
}
После определения функции "main()" в этой программе содержится определе-
ние функции рисования окружности "drawCircle(...)". Детали реализации этой
функции сейчас не существенны (будем считать, что функция drawCircle(...)" реа-
лизована корректно и ею можно пользоваться так же, как, например, функцией
|
|
"sqrt(...)"). Обратите внимание, что, хотя переменная "radius" используется в обеих
функциях "main()" и "drawCircle(...)", это не одна и та же переменная, а две разных.
Если бы переменная "radius" была описана до функции "main", то в таком слу-
чае она была бы глобальной переменной (общедоступной). Тогда, предполагая, что
внутри функции "drawCircle(...)" описания переменной уже нет, если "drawCircle(...)"
присвоит глобальной переменной значение "SCREEN_WIDTH/2.0", то это
значение чуть позже функция "main()" использует для вычисления длины окружности
и получится неверный результат.
В приведенной программе глобальной переменной нет, а есть две локальных
переменных "radius". Например, первая переменная "radius" является локальной пе-
26
ременной функции "main()", или, говорят, что функция "main()" является областью
видимости этой переменной.
Константы общего назначения, такие, как "PI" и "SCREEN_WIDTH", принято опи-
сывать глобально, чтобы они были доступны внутри любой функции.
Для контроля действий программы в приведенном фрагменте предусмотрено
повторное отображение данных, введенных пользователем. Другими словами, задан-
ное пользователем значение "radius" еще раз печатается на экране перед отображени-
ем длины окружности.