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



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

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

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

Давайте изучим следующий код:

#include

int add ( int a , int b ) // здесь создаются переменные a и b

{

// a и b можно видеть/использовать только внутри этой функции

return a + b ;

} // здесь a и b выходят из области видимости и уничтожаются

int main ( )

{

int x = 7 ; // здесь создается и инициализируется переменная x

int y = 8 ; // здесь создается и инициализируется переменная y

// x и y можно использовать только внутри функции main()

std :: cout << add ( x , y ) << std :: endl ; // вызов функции add() с a = x и b = y

return 0 ;

} // здесь x и y выходят из области видимости и уничтожаются

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

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

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

Всё закончено!

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

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

Как видно из данного примера, переменные x и y имеют свои особенности, которые отличают их от переменных a и b.

Давайте теперь изучим следующий код:

#include

int add ( int a , int b ) // здесь создаются переменные a и b функции add()

{

return a + b ;

} // здесь a и b функции add() выходят из области видимости и уничтожаются

int main ( )

{

int a = 7 ; // здесь создается переменная a функции main()

int b = 8 ; // здесь создается переменная b функции main()

std :: cout << add ( a , b ) << std :: endl ; // значения переменных a и b функции main() копируются в переменные a и b функции add()

return 0 ;

} // здесь a и b функции main() выходят из области видимости и уничтожаются

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

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

Соглашение: Идентификаторы, применяемые внутри функции (включая аргументы), ограничены доступом только в пределах данной функции.

Тест

Какой результат будет получен при выполнении данной программы?

#include

void doMath ( int a )

{

int b = 5 ;

std :: cout << "doMath: a = " << a << " and b = " << b << std :: endl ;

a = 4 ;

std :: cout << "doMath: a = " << a << " and b = " << b << std :: endl ;

}

int main ( )

{

int a = 6 ;

int b = 7 ;

std :: cout << "main: a = " << a << " and b = " << b << std :: endl ;

doMath ( a ) ;

std :: cout << "main: a = " << a << " and b = " << b << std :: endl ;

return 0 ;

}

Пожалуйста, оставляйте свои ответы в комментариях ниже!
145   0  

Comments

    Ничего не найдено.