Каждое имя в языке C++ (за исключением имен препроцессора; см. раздел A.17) имеет определенную
A.4.1. Область видимости
Существует пять видов областей видимости (см. раздел 8.4).
•
•
•
•
• ...
) инструкции for
, while
, switch
или if
.
Область видимости переменной распространяется (исключительно) до конца инструкции, в которой она объявлена. Рассмотрим пример.
for (int i = 0; i
// переменная i может быть использована здесь
}
if (i < 27) // переменная i из инструкции for вышла из области
// видимости
Области видимости класса и пространства имен имеют свои имена, поэтому можем ссылаться на их членов извне. Рассмотрим пример.
void f(); // в глобальной области видимости
namespace N {
void f() // в пространстве области видимости N
{
int v; // в локальной области видимости
::f(); // вызов глобальной функции f()
}
}
void f()
{
N::f(); // вызов функции f(x) из области видимости N
}
Что произойдет, если мы вызовем функции N::f()
или ::f()
? См. раздел A.15.
A.4.2. Класс памяти
Существуют три
• static
. Автоматическая память выделяется, когда функция вызывается, и освобождается при возвращении управления в вызывающий модуль. Таким образом, если функция (явно или неявно) вызывает сама себя, может существовать несколько копий автоматических данных: по одной копии на каждый вызов (см. раздел 8.5.8).
• static
в функциях и классах. Редактор связей выделяет статическую память до запуска программы.
• new
, размещаются в свободной памяти.
Рассмотрим пример.
vector
// ("до функции main()")
vector
{
static vector
// вызове f()
vector
for (int i=1; i<10; ++i) {
vector
// ...
} // переменная v1 уничтожается здесь (на каждой итерации)
return new vector
// как копия переменной vf
} // переменная vf уничтожается здесь
void ff()
{
vector
// .. .