•
•
•
• Локальная область видимости (local scope). Часть текста, заключенная в фигурные скобки, { ... }, в блоке или функции.
• Область видимости инструкции (например, в цикле for
).
Основное предназначение области видимости — сохранить локальность имен, чтобы они не пересекались с именами, объявленными в другом месте. Рассмотрим пример.
void f(int x) // функция f является глобальной;
// переменная x является локальной в функции f
{
int z = x+7; // переменная z является локальной
}
int g(int x) // переменная g является глобальной;
// переменная x является локальной в функции g
{
int f = x+2; // переменная f является локальной
return 2*f;
}
Изобразим это графически.
Здесь переменная x
, объявленная в функции f()
, отличается от переменной x
, объявленной в функции g()
. Они не создают недоразумений, потому что принадлежат разным областям видимости: переменная x
, объявленная в функции f()
, не видна извне функции f()
, а переменная x
, объявленная в функции g()
, не видна извне функции g()
. Два противоречащих друг другу объявления в одной и той же области видимости создают f
объявлена и используется в функции g()
и (очевидно) не является функцией f()
.
Рассмотрим логически эквивалентный, но более реальный пример использования локальной области видимости.
int max(int a, int b) // функция max является глобальной;
// а переменные a и b — локальными
{
return (a>=b) ? a : b;
}
int abs(int a) // переменная a, не имеющая отношения
// к функции max()
{
return (a<0) ? –a : a;
}
Функции max()
и abs()
принадлежат стандартной библиотеке, поэтому их не нужно писать самому. Конструкция ?:
a>=b)?a:b
равно a
, если a>=b
, и b
— в противном случае. Условное выражение позволяет не писать длинный код наподобие следующего:
int max(int a, int b) // функция max является глобальной;
// а переменные a и b — локальными
{
int m; // переменная m является локальной
if (a>=b)
m = a;
else
m = b;
return m;
}
Рассмотрим более крупный технический пример, иллюстрирующий ситуацию, в которой имена выходят за пределы области видимости в конце инструкции и блоков (включая тела функций).
// здесь переменные r, i и v не видны
class My_vector {
vector
// видимости класса
public:
int largest()
{
int r = 0; // переменная r является локальной
// (минимальное неотрицательное целое число)
for (int i = 0; i
r = max(r,abs(v[i])); // переменная i принадлежит
// области видимости цикла
// здесь переменная i не видна
return r;
}
// здесь переменная r не видна
}
// здесь переменная v не видна
int x; // глобальная переменная — избегайте по возможности