Урок 15. Локальная область видимости С++

   ⁄ 

 Обновлено 16 Авг 2017

  ⁄   

Мы уже рассматривали в 10 уроке ситуацию, когда процессор выполняет инструкцию int х; - это приводит к созданию переменной. Возникает естественный вопрос: «Так когда переменная уничтожается?».

Область видимости переменной определяет, кто может видеть и использовать переменную во время её существования. И параметры функции, и переменные, которые объявляются внутри тела функции, имеют локальную область видимости (local scope). Т. е. эти переменные рассматриваются и используются только внутри функции, в которой они объявлены. Локальные переменные создаются в точке объявления и уничтожаются, когда выходят из области видимости.

Рассмотрим следующую программу:

В функции add() параметры х и у, которые создаются при вызове функции, можно увидеть или использовать только внутри add() и они уничтожаются в конце этой же функции.

Переменные а и b, которые создаются внутри функции main(), можно увидеть или использовать только внутри main() и они также в конце уничтожаются.

Для лучшего понимания, давайте проследим ход действий этой программы детальнее:

 выполняется main();

 создается переменная а в функции main() и ей присваивается значение 5;

 создается переменная b в функции main() и ей присваивается значение 6;

 функция аdd() вызывается со значениями параметров 5 и 6;

 создается переменная х в функции add() и ей присваивается значение 5;

 создается переменная у в функции add() и ей присваивается значение 6;

 оператор + добавляет числа 5 и 6 и получается значение 11;

 функция add() возвращает значение 11 в caller (в функцию main());

 переменные функции add() х и у уничтожаются;

 main() выводит 11 в консоль;

 main() возвращает 0 в операционную систему;

 переменные функции main() а и b уничтожаются.

Всё.

Обратите внимание, что если бы функция add() вызывалась дважды, параметры х и у создавались и уничтожались бы также дважды. В программе с большим количеством функций, переменные создаются и уничтожаются часто.

Локальная область видимости предотвращает конфликт имен

В приведенном выше примере видно, что переменные а и b отличаются от переменных х и у.

Теперь давайте рассмотрим следующую программу:

В этом примере, всё, что мы сделали – изменили имена переменных а и b внутри main() на х и у. Эта программа по-прежнему работает нормально, несмотря на то, что обе функции main() и add() имеют переменные х и у. Почему это не вызывает конфликт имен? Потому что х и у функции main() находятся в локальной области видимости, add() не может их увидеть. Ни add(), ни main() не знают, что они имеют переменные с одинаковыми именами!

Это значительно снижает количество конфликтов имен. Любая функция не должна знать или заботиться о том, как другая функция называет свои переменные. Это также предотвращает ситуации, когда одни функции могут непреднамеренно (или намеренно) изменять значения переменных внутри других функций.

Более детально о локальной области, а также о других видах областях мы поговорим позднее.

Правило: Имена, используемые для параметров или для переменных, объявленные в теле функции видны только внутри этой же функции.

Тест

1) Что выводит следующая программа?

Ответ

Чтобы увидеть результат, нажмите на ссылку.

Ответ 1

main: x = 1 y = 2
doIt: x = 3 y = 4
main: x = 1 y = 2

Вот последовательность событий этой программы:

 выполняется main();

 создается переменная х функции main(), ей присваивается значение 1;

 создается переменная у функции main(), ей присваивается значение 2;

 cout выводит «main: х = 1 у = 2»;

 doIt() вызывается с параметром 1;

 создается переменная х функции doIt(), ей присваивается значение 1;

 переменной х функции doIt() присваивается значение 3;

 создается переменная у функции doIt(), ей присваивается значение 4;

 cout выводит «doIt: х = 3 у = 4»;

 х и у функции doIt() уничтожаются;

 cout выводит «main: х = 1 у = 2»;

 main() возвращает 0 операционной системе;

 х и у функции main() уничтожаются;

Обратите внимание, что даже если переменным х и у функции doIt() присвоить другие значения, то переменные функции main() все равно не меняются.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (33 оценок, среднее: 4,82 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *