Сокрытие имен

Локальные переменные могут быть объявлены в любом блоке

 

Чаще всего все переменные, которые будут нужны в некоторой функции, объявляются в начале ее функционального блока. Так поступают главным образом для того, чтобы тот, кто будет читать этот код, мог легко определить, какие переменные будут в нем использоваться. Однако начало функционального блока не является единственным местом, где можно объявлять локальные переменные. Локальную переменную можно объявить где угодно, в любом блоке кода. Переменная, объявленная внутри блока, локальна по отношению к этому блоку. Это означает, что переменная не существует, пока не начал выполняться этот блок, и уничтожается вместе с завершением блока.

Никакие предложения вне этого блока — включая остальные строки той же функции - не могут обратиться к этой переменной. Для того, чтобы усвоить это ограничение, рассмотрим следующую программу:

 

// Переменные могут быть локальными по отношению к блоку.

 

#include <iostream>

using namespace std;

 

int main () {

int x = 19; // x известна всюду,

if(x == 19) {

int y = 20 ; // у локальна по отношению к блоку if.

cout << "х + у равно " << x + y << "\n";

}

// у = 100; // Ошибка! у здесь неизвестна,

return 0;

}

 

Переменная х объявлена в начале области видимости main() и доступна всему последующему коду, входящему в main(). Внутри блока if объявляется переменная у. Поскольку блок определяет область видимости, у видима только для остального кода внутри своего блока. Поэтому вне этого блока предложение

 

у = 100;

 

закомментировано. Если вы удалите ведущие символы комментария, при компиляции будет зафиксирована ошибка, поскольку у не видна вне ее блока. Внутри блока if можно использовать х, потому что код внутри блока имеет доступ к переменным, объявленным во внешнем блоке, содержащем в себе данный.

Хотя локальные переменные обычно объявляются в начале их блока, это не обязательно. Локальная переменная может быть объявлена в любом месте внутри блока, но, разумеется, перед тем, как она будет использоваться. Например, следующая программа вполне правильна:

#include <iostream>

using namespace std;

 

int main() {

cout << "Введите число: ";

int a; // объявим одну переменную

cin >> a;

 

cout << "Введите второе число:";

int b; // объявим другую переменную

cin >> b;

 

cout << "Произведение: " << a*b << '\n';

 

return 0;

}

 

 

В этом примере а и b не объявляются до тех пор, пока в них не возникает необходимость. Честно говоря, большинство программистов объявляют локальные переменные в начале использующей их функции, но это вопрос вкуса.

 

 

Если локальная переменная, объявленная во внутреннем блоке, имеет то же имя, что и переменная, объявленная во внешнем блоке, то переменная, объявленная во внутреннем блоке, скрывает переменную из внешнего блока. Например:

 

#include <iostream>

using namespace std;

 

int main()

{

int i ;

int j ;

i = 10;

j = 100;

 

if (j > 0) {

int i; // эта i отличается от внешней i

i = j / 2;

cout << "внутренняя i: " << i << '\n';

}

cout << "внешняя i: " << i << '\n';

return 0;

}

 

Вывод этой программы:

 

внутренняя i : 5 0

внешняя i : 10

 

Переменная i, объявленная внутри блока if, скрывает внешнюю переменную i. Изменение значения внутренней i не оказывает влияния на внешнюю i. Более того, вне блока if внутренняя i неизвестна, и снова становится видимой внешняя i.