Описание определяет имя в области видимости.
Таким образом, имя может применяться только в некоторой части программы. Для имени, которое описано в функции (такое имя часто называют локальным), эта область видимости располагается от точки
описания до конца блока, в котором появилось описание. Для имени не в функции и не в классе (называемого часто глобальным именем) область видимости находится от точки описания до конца файла,
в котором появилось описание. Описание имени в блоке может прятать описание во внутреннем блоке или
глобальное имя, т. е. можно переопределять имя внутри блока с целью ссылки на другой объект. После выхода из блока имя опять получает свое прежнее значение.
Например:
int x; -- глобальное x
f() {
int x; -- локальное x прячет глобальное x
x = 1; -- присвоить локальному x
{
int x; -- прячет первое локальное x
x = 2; -- присвоить второму локальному x
}
x = 3; -- присвоить первому локальному x
}
int* p = &x -- взять адрес глобального x
Скрытие имен обязательно при написании
больших программ. Но читающий человек легко
может не заметить, что имя скрыто, и некоторые ошибки, которые возникают вследствие этого, очень тяжело
обнаружить, в основном потому, что они редкие. Применение для глобальных переменных имен i или x напрашивается на неприятности. С помощью операции
разрешения области видимости :: можно применять
скрытое глобальное имя. Например:
int x;
f()
{
int x = 1; -- скрывает глобальное x
::x = 2; -- присваивает глобальному x
}
Однако возможности применять скрытое локальное имя нет. Область видимости имени начинается
точкой описания. То есть имя можно применять даже
для задания его собственного значения. К примеру:
int x;
f()
{
int x = x; -- извращение
}