Бьерн Страуструп.
Язык программирования С++
48
}
Возможность использовать скрытое локальное имя отсутствует.
Область видимости имени начинается в точке его описания (по окончании описателя, но еще до начала
инициализатора - см. $$R.3.2). Это означает, что имя можно использовать даже до того, как задано его
начальное значение. Например:
int x;
void f3()
{
int x = x;
// ошибочное присваивание
}
Такое присваивание недопустимо и лишено смысла. Если вы попытаетесь транслировать эту программу,
то получите предупреждение: "использование до задания значения". Вместе с тем, не применяя оператора
::, можно использовать одно и то же имя для обозначения двух различных объектов блока. Например:
int x = 11;
void f4()
// извращенный пример
{
int y = x;
// глобальное x
int x = 22;
y = x;
// локальное x
}
Переменная y инициализируется значением глобального x, т.е. 11, а затем ей присваивается значение
локальной переменной x, т.е. 22. Имена формальных параметров функции считаются описанными в
самом большом блоке функции, поэтому в описании ниже есть ошибка:
void f5(int x)
{
int
x;
//
ошибка
}
Здесь x определено дважды в одной и той же области видимости. Это хотя и не слишком редкая, но
довольно тонкая ошибка.
Достарыңызбен бөлісу: