Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Итог_Пособие C++.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.03 Mб
Скачать

1.3.3 Описание переменных

Оператор описания переменных и именованных констант имеет вид:

[спецификатор_класса_памяти][const][тип] имя[=значение][, имя[=знач.]]…;

Обратим внимание, что только имя является обязательным – даже тип в определённой конфигурации описания указывать не нужно. Для присвоения начального значения (инициализации переменной) вместо знака “=” можно использовать и другой синтаксис (более современный):

имя_переменной (значение), например, int x(5);.

Спецификатор класса памяти – дополнительные указания компилятору, как следует выделять память под переменную. Он может принимать значения: auto, extern, register, static. Если спецификатор в описании явно не указан, память для переменной выделяется компилятором, исходя из того места в программе, где это описание находится, и типа данных.

Ключевое слово const используется при описании именованных констант. В этом случае обязательно нужно задать значение константы. Если переменная явно не проинициализирована, то глобальные и статические (static) переменные получат нулевые значения. Локальные переменные (описанные в теле функций, в том числе, и в функции main) не инициализируются ничем и содержат мусор.

Например:

char a=’a’,b=’b’;

double x,y;

const double Y(1E-5);

const float PI = 3.1415926;

Спецификаторы класса памяти. Кратко поясним назначение каждого из спецификаторов.

Обратим внимание, что спецификатор auto поменял своё назначение в стандарте С++ 11 и теперь означает автоматическое выведение типа переменной и размера выделяемой памяти, исходя из значения, которым инициализируется переменная. При использовании этого спецификатора тип явно указывать не нужно, но задать значение требуется обязательно.

Например: auto pi=3.1415926;

Спецификатор register предписывает компилятору распределить память для переменной в каком-либо регистре процессора или кэш-памяти, если это возможно, для повышения скорости доступа к этой переменной. Формально спецификатор register представляет собой лишь запрос, который компилятор вправе проигнорировать. Переменная с таким спецификатором должна иметь тип int и быть локальной.

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

// Пример 1.2 Использование спецификатора static

void fun(int x) {

static int i=x; cout << i << “ “;

}

int main(){

fun(1); fun(2);… return 0;

}

Результат этого, в общем то, бесполезного, примера будет неожиданным – 1 1. Дело в том, что инициализация статической переменной выполняется только один раз – при первом исполнении блока, в котором она описана. Если переменная со спецификатором static явным образом не инициализирована, она инициализируется нулём.

Спецификатор static можно применять и при описании глобальных переменных, в этом случае переменная будет доступна только в том файле, в котором она описана. Такое употребление static не рекомендуется – лучшим способом будет использование пространства имён.

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

Файл a.cpp:

int x;

Файл b.cpp:

extern int x;

int main(){

x=5; …

}

Обратим внимание – если при объявлении переменной указан класс памяти register или static, то тип можно не указать – по умолчанию будет int.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]