Область видимости переменных в C++: локальные и глобальные переменные
Всем привет! Сегодня мы затронем тему, которую должны были изучить еще в самом начале пути изучения C++ — область видимости переменных. Мы разберем, что такое локальные и глобальные переменные.
- Глобальные переменные
- Локальные переменные
- Глобальная переменная уступает локальной
- Глобальный оператор разрешения
Область видимости переменных в C++
Область видимости переменных — это те части программы, в которой пользователь может изменять или использовать переменные в своих нуждах.
В C++ существуют отдельные блоки, которые начинаются с открывающей скобки ({
) и заканчиваются соответственно закрывающей скобкой (}
). Такими блоками являются циклы (for, while, do while) и функции.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
int func () { // блок (функция - func) } int main() { // блок (функция - main) for (int i = 0; i < 10; i++) { // блок (цикл - for), также является дочерним блоком функции main for (int j = 0; j < 5; j++) { // блок (цикл - for), но он еще является и дочерним блоком для первого цикла } } system("pause"); return 0; } |
Если переменная была создана в таком блоке, то ее областью видимости будет являться этот блок от его начала (от открывающей скобки — {
) и до его конца (до закрывающей скобки — }
) включая все дочерние блоки созданные в этом блоке.
В примере ниже, программист ошибся с областью видимости:
- Он создал переменную
j
во втором цикле. - Использовав ее в первом цикле
for
он вынудил компилятор сообщить об ошибке (переменнойj
больше нет, поскольку второй цикл закончил свою работу).
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int main() { for (int i = 0; i < 10; i++) { int b = i; for (int j = 0; j < 5; j++) { cout << b + j; } cout << j; // ошибка: так как переменная j была создана в другом блоке } system("pause"); return 0; } |
А вот ошибки в строке 6 нет, поскольку второй цикл находится в первом цикле (является дочерним блоком первого цикла) и поэтому переменная b
может спокойно там использоваться.
Глобальные переменные в C++
Глобальными переменными называются те переменные, которые были созданы вне тела какого-то блока. Их можно всегда использовать во всей вашей программе, вплоть до ее окончания работы. В примере ниже мы создали две глобальные переменные global
и global_too
и использовали их в функции summa
:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int global = 5; // глобальные int global_too = 10; // переменные int summa() { cout << global + global_too; // суммируем числа } int main() { summa(); // вызываем функцию summa system("pause"); return 0; } |
Вот, что выведет данная программа:
Как видите глобальные переменные видны везде. В нашем примере внутри функции summa
мы не создавали ни какие переменные, мы лишь использовали две глобальные переменные, которые были созданы раньше.
Локальные переменные
Локальные переменные — это переменные созданные в блоках. Областью видимости таких переменных является блоки ( и все их дочерние ), а также их область видимости не распространяется на другие блоки. Как ни как, но эти переменные созданы в отдельных блоках.
Из этого можно сделать вывод: у нас есть возможность создавать переменные с одинаковыми именами, но в разных блоках (или другими словами, чтобы их область видимости не совпадала друг с другом).
1 2 3 4 5 6 7 8 |
int main() { for (int i = 0; i < 2; i++) { int b = i; // локальная переменная (она находится в блоке for) cout << b; } system("pause"); return 0; } |
В примере выше блоком где была создана локальная переменная b
является цикл for
(2 — 5). А вот если бы мы захотели вывести переменную b
вне блока for
, компилятор сообщил бы нам об ошибке, подробнее об этом говорится ниже.
Распространенной ошибкой среди начинающих программистов является использование локальных переменных в других блоках. Например ниже мы решили использовать переменную cost
в функции summa
, хотя мы ее создали в совершенно другой функции — main
.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int summa () { cout << cost; // ошибка } int main() { int cost = 10; // переменная созданная в блоке main summa(); system("pause"); return 0; } |
Нужно запомнить! Если вы создали локальную переменную, то вы должны понимать, что использование ее в других блоках будет невозможным.
Глобальная переменная уступает локальной
Если мы создадим глобальную переменную и с таким же именем локальную, то получится, что там где была создана локальная переменная будет использоваться именно локальная переменная, а не глобальная. Так как локальная переменная считается по приоритету выше глобальной. Давайте разберем, как это работает на примере ниже:
1 2 3 4 5 6 7 8 9 |
string str = "You lucky!"; void message() { string str = "You very lucky man!"; cout << str; } void sait_message() { cout << str; } |
Мы создали глобальную переменную str
со значением «You lucky!» и локальную переменную с таким же названием в функции message
, но с другим значением — «You very lucky man!». Если мы вызовем функцию message
, то результатом будет:
А вот, если мы вызовем функцию sait_message
то результатом будет:
Вот так глобальная переменная уступает локальной!
Мы советуем вам не создавать переменные с одинаковыми именами, поскольку в будущем вам будет тяжело разобраться в коде, если там будут присутствовать одинаковые переменные.
Глобальный оператор разрешения
В случае создания двух переменных с одинаковым именем (одна из которых является глобальной, а другая локальной) при использовании в блоке, в котором была объявлена локальная переменная, можно использовать и глобальную переменную. Для ее использования нужно всего лишь применить глобальный оператор разрешения.
Глобальный оператор разрешения — это два подряд поставленные двоеточия, с помощью которых мы говорим компилятору, что хотим использовать глобальную переменную, а не локальную.
Чтобы использовать глобальный оператор разрешения нужно применять данную конструкцию:
1 |
:: <имя глобальной переменной> |
В примере ниже вы можете увидеть, как работает глобальный оператор разрешения:
1 2 3 4 5 6 |
string str = "You lucky!"; void message() { string str = "You very lucky man!"; cout << :: str; // использовали глобальный оператор разрешения } |
Получится вот такой результат, если мы вызовем функцию message
:
Какие виды переменных использовать
Сегодня мы разобрали, что такое область видимости в C++. Также мы рассмотрели, что такое локальные переменные и глобальные переменные.
У многих может возникнуть соответствующий вопрос:»Какие переменные нам лучше использовать в своих программах?». Мы считаем, что разницы нет, какие переменные вы будете использовать, глобальные и локальные виды переменных нужно использовать вместе. Тяжело будет использовать только один вид переменных!
Тест на тему «Функции в C++»
Если эта надпись не исчезает долгое время, попробуйте обновить страницу. Этот тест использует javascript. Пожалуйста, влкючите javascript в вашем браузере.
Мы рады, если вам понравилась данный урок. Если вы хотите оставить свой вопрос, то пишите его в комментариях. Нам будет приятно, если вы поделитесь данной статьей со своими друзьями. Удачи!
Вы правы! Глобальный оператор расширения редко используется в проектах.