C++ | страница 33



int x; // глобальное x

f() (* int x; // локальное x прячет глобальное x x = 1; // присвоить локальному x (* int x; // прячет первое локальное x x = 2; // присвоить второму локальному x *) x = 3; // присвоить первому локальному x *)

int* p = amp;x; // взять адрес глобального x

Сокрытие имен неизбежно при написании больших программ. Однако читающий человек легко может не заметить, что имя скрыто, и некоторые ошибки, возникающие вследствие этого,


очень трудно обнаружить, главным образом потому, что они редкие. Значит сокрытие имен следует минимизировать. Использование для глобальных переменных имен вроде i или x напрашиваемся на неприятности.

С помощью применения операции разрешения области видимости :: можно использовать скрытое глобальное имя. Например:

int x;

f() (* int x = 1; // скрывает глобальное x ::x = 2; // присваивает глобальному x *)

Но возможности использовать скрытое локальное имя нет.

Область видимости имени начинается в точке описания. Это означает, что имя можно использовать даже для задания его собственного значения. Например:

int x;

f() (* int x = x; // извращение *)

Это не является недопустимым, хотя и бессмысленно, и компилятор предупредит, что x «used before set» («использовано до того, как задано»), если вы попробуете так сделать. Можно, напротив, не применяя операцию ::, использовать одно имя для ссылки на два различных объекта в блоке. Например:

int x;

f() // извращение (* int y = x; // глобальное x int x = 22; y = x; // локальное x *)

Переменная y инициализируется значением глобального x, 11, а затем ему присваивается значение локальной переменной x, 22.

Имена параметров функции считаются описанными в самом внешнем блоке функции, поэтому

f(int x) (* int x; // ошибка *)

содержит ошибку, так как x определено дважды в одной и той же области видимости.

2.1.2 Объекты и Адреса (Lvalue)

Можно назначать и использовать переменные, не имеющие имен, и можно осуществлять присваивание выражениям странного вида (например, *p[a+10]=7). Следовательно, есть потребность в имени «нечто в памяти». Вот соответствующая цитата из справочного руководства по С++: "Объект есть область памяти.


lvalue есть выражение, ссылающееся на объект" (#с.5). Слово «lvalue» первоначально было придумано для значения «нечто, что может стоять в левой части присваивания». Однако не всякое lvalue можно использовать в левой части присваивания; бывают lvalue, ссылающиеся на константу (см. #2.4).

2.1.3 Время Жизни