Урок №18. Локальна область видимості

  Юрій  | 

  Оновл. 15 Кві 2020  | 

 213

Як ми вже знаємо з попередніх уроків, при виконанні процесором стейтменту int х; створюється змінна. Виникає питання: «Коли ця змінна знищується?”.

Область видимості змінної визначає, хто може бачити і використовувати змінну під час її існування. І параметри функції, і змінні, які оголошені усередині функції, мають локальну область видимості. Іншими словами, ці змінні використовуються тільки всередині функції, в якій вони оголошені. Локальні змінні створюються в точці оголошення і знищуються, коли виходять із області видимості.

Розглянемо наступну програму:

Параметри 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 назад в викликаючу функцію (в функцію main());

   змінні функції add() a і b знищуються;

   main() виводить значення 15 на екран;

   main() повертає 0 в операційну систему;

   змінні функції main() x і y знищуються.

Все!

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

Локальна область видимості запобігає виникненню конфліктів імен

З прикладу вище зрозуміло, що змінні x і y відрізняються від змінних a і b. Тепер давайте розглянемо наступну програму:

Тут ми змінили імена змінних x і y функції main() на a і b. Програма, як і раніше працює коректно, не дивлячись на те, що функція add() також має змінні a і b. Чому це не викликає конфлікт імен? Справа в тому, що a і b функції main() є локальними змінними, функція add() не може їх бачити (і навпаки). Ні add(), ні main() не знають, що вони мають змінні з однаковими іменами!

Це значно знижує можливість виникнення конфлікту імен. Будь-яка функція не повинна знати або турбуватися про те, які змінні знаходяться в іншій функції. Це також запобігає виникненню ситуацій, коли одні функції можуть ненавмисно (або навмисно) змінювати значення змінних інших функцій.

Правило: Імена, які використовуються всередині функції (включаючи параметри), доступні тільки всередині цієї ж функції.

Тест

Який результат виконання наступної програми?

Відповідь

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;

   std::cout виводить на екран main: a = 6 and b = 7;

   викликається функція doMath() з аргументом 6;

   створюється змінна a функції doMath() і їй присвоюється значення 6;

   виконується ініціалізація змінної b функції doMath() значенням 5;

   std::cout виводить на екран doMath: a = 6 and b = 5;

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

  std::cout виводить на екран doMath: a = 4 and b = 5;

   a і b функції doMath() знищуються;

   std::cout виводить на екран main: a = 6 and b = 7;

   main() повертає 0 в операційну систему;

   a і b функції main() знищуються.

Зверніть увагу, навіть коли ми присвоювали значення змінним a і b всередині функції doMath(), на змінні всередині функції main() це ніяк не вплинуло.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (3 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *