Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по ПЯВУ.doc
Скачиваний:
4
Добавлен:
26.10.2018
Размер:
468.48 Кб
Скачать

11. Область видимости имён. Классы памяти.

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

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

Глобальные имена видимы от точки их объявления до конца файла, если они не замаскированы локальными именами.

Переменные из объемлющих блоков, как и глобальные, видимы во внутренних блоках.

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

int i=3;

{ int c = i; // с становится = =3;

...

int i = 0; // имя i маскирует внешнее имя i;

cout << "c = "<< c <<", i= "<< i << ".\n";

} // конец области существования имен i, c из блока; опять видно имя i, объявленное перед блоком.

cout << " i = "<< i << ".\n";

Здесь будет выведено c=3, i=0.

i=3.

Если скрытым именем является глобальное имя функции или объекта, то обратиться к нему можно, используя операцию разрешения доступа, или разрешения контекста ::.

int i=5; // Глобальная переменная;

void main (){

int i=1; // локальная переменная.

i++;

::i++;

cout<< "i="<< i<< ", глобальное i="<< ::i<< ".\n";

}

Здесь будет напечатано i=2, глобальное i=6.

С помощью операции :: нельзя обратиться к скрытому локальному объекту.

Классы памяти.

В С++ существуют 3 класса памяти.

1) Статическая память - статические данные, размещаемые в сегменте данных;

2) автоматические данные, размещаемые в специальном стеке (сегмент стека) или как частный случай, в регистрах процессора;

3) динамические данные, явно размещаемые в динамической памяти с помощью операций new и delete.

Статические объекты существуют в течение всего времени выполнения программы. К ним относятся глобальные и локальные переменные, объявленные со служебным словом static:

int i=3, j; // глобальные переменные. Класс памяти - static;

void main(){

int a; // Автоматическая переменная;

static float b[1000], c=2.3; // статические переменные;

...

...

}

int f(){int d; // автоматическая переменная;

static int m=2, k; // статические переменные m, k.

...

}

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

Локальные переменные, не объявленные как static, являются автоматическими. Такие объекты начинают свое существование при объявлении его имени в блоке и заканчивают его при завершении этого блока. Если автоматический объект явно не инициализирован, то его значение до присвоения не определено.

void f();

void main(){

for (int i = 3; i > 0; i- -) f();

}

void f(){static int i; int j = 0;

cout<< "i ="<< i++<< " j ="<< j++<< "\n";

}

Здесь будет напечатано: i = 0 j = 0

i = 1 j = 0

i = 2 j = 0

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