Упражнение 2.12. Какие из приведенных ниже имен недопустимы (если таковые есть)?
>(a) int double = 3.14; (b) int _;
>(с) int catch-22; (d) int 1_or_2 = 1;
>(e) double Double = 3.14;
2.2.4. Область видимости имен
В любом месте программы каждое используемое имя относится к вполне определенной сущности — переменной, функции, типу и т.д. Однако имя может быть использовано многократно для обращения к различным сущностям в разных точках программы.
Область видимости (scope) — это часть программы, в которой у имени есть конкретное значение. Как правило, области видимости в языке С++ разграничиваются фигурными скобками.
В разных областях видимости то же имя может относиться к разным сущностям. Имена видимы от момента их объявления и до конца области видимости, в которой они объявлены.
В качестве примера рассмотрим программу из раздела 1.4.2:
>#include
>int main() {
> int sum = 0;
> // сложить числа от 1 до 10 включительно
> for (int val = 1; val <= 10; ++val)
> sum += val; // эквивалентно sum = sum + val
> std::cout << "Sum of 1 to 10 inclusive is "
> << sum << std::endl;
> return 0;
>}
Эта программа определяет три имени — >main
, >sum
и >val
, а также использует имя пространства имен >std
, наряду с двумя именами из этого пространства имен — >cout
и >endl
.
Имя >main
определено вне фигурных скобок. Оно, как и большинство имен, определенных вне функции, имеет глобальную область видимости (global scope). Будучи объявлены, имена в глобальной области видимости доступны в программе повсюду. Имя >sum
определено в пределах блока, которым является тело функции >main()
. Оно доступно от момента объявления и далее в остальной части функции >main()
, но не за ее пределами. Переменная >sum
имеет область видимости блока (block scope). Имя >val
определяется в пределах оператора >for
. Оно применимо только в этом операторе, но не в другом месте функции >main()
.
Объект имеет смысл определять поближе к месту его первого использования. Это улучшает удобочитаемость и облегчает поиск определения переменной. Однако важней всего то, что когда переменная определяется ближе к месту ее первого использования, зачастую проще присвоить ей подходящее исходное значение.
Области видимости могут содержать другие области видимости. Содержащаяся (или вложенная) область видимости называется внутренней областью видимости (inner scope), а содержащая ее области видимости — внешней областью видимости (outer scope).
Как только имя объявлено в области видимости, оно становится доступно во вложенных в нее областях видимости. Имена, объявленные во внешней области видимости, могут быть также переопределены во внутренней области видимости:
>#include
>// Программа предназначена исключительно для демонстрации.
>// Использование в функции глобальной переменной, а также определение
>// одноименной локальной переменной - это очень плохой стиль
>// программирования
>int reused = 42; // reused имеет глобальную область видимости
>int main()