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

   | 

   | 

 Обновлено 25 Фев 2018  | 

 7727

 ǀ   6 

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

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

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

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

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

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

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

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

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



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

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

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

  оператор + добавляет числа 7 и 8 и получается значение 15;

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

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

  main() выводит значение 15 в консольное окно;

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

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

Всё.

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

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

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

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

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

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

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

Тест

1. Каков результат выполнения следующей программы?

Ответ

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

Ответ 1

main: a = 6 and b = 7
doMath: a = 6 and b = 5
doMath: a = 4 and b = 5
main: a = 6 and b = 7

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

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

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

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

  cout выводит «main: a = 6 and b = 7»;

  вызывается doMath() с аргументом 6;

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

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

  cout выводит «doMath: a = 6 and b = 5»;

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

  cout выводит «doMath: a = 4 and b = 5»;

  a и b функции doMath() уничтожаются;

  cout выводит «main: a = 6 and b = 7»;

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

  a и b функции main() уничтожаются.

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

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

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

Комментариев: 6

  1. Александра:

    Отличный урок! Да и все остальные тоже =) Понятным и доступным языком все объясняется.
    Но вот проблема с этим уроком: не посмотреть ответ на тест =(

  2. Степан:

    Привет! Будешь дальше переводить оригинальный сайт?
    Интересно почитать про жесть из STL.

    Отличный сайтец, спасибо!

    1. Li4ik Li4ik:

      Привет. Да, малость уроков осталась. Самому тоже интересно дойти до STL.

      Пожалуйста 🙂

  3. painkiller:

    Очень полезный урок. Спасибо!

    1. Li4ik Li4ik:

      Пожалуйста 🙂

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

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

ПОДПИСЫВАЙТЕСЬ

НА КАНАЛ RAVESLI В TELEGRAM

@ravesli

ПОДПИСАТЬСЯ БЕСПЛАТНО