[БЕЗ_ЗВУКА] Поговорим о видимости переменных в C++.
Давайте рассмотрим вот такой пример.
Давайте напишем cout x и после этого объявим переменную x = 5.
И зададимся вопросом: а скомпилируется ли такая программа?
Потому что мы выводим переменную x, которая вот тут рядышком.
Запустим компиляцию и видим, что программа не компилируется.
Компилятор говорит нам: x не был объявлен
в данном месте использования, и это видно.
То есть что мы видим?
Что до того как мы объявили переменную,
мы не можем на неё ссылаться и никак не можем ею пользоваться.
Если мы поменяем местами эти две команды,
то всё встанет на свои места, программа скомпилируется и выведет 5.
Давайте рассмотрим другой пример.
Поставим операторные скобки, объявим переменную x.
Поставим ещё одни операторные скобки, выведем переменную x.
Выведем переменную x ещё раз и выведем её третий раз
за пределами первых операторных скобок.
Вопрос у нас всё тот же: скомпилируется ли это?
Запустим компиляцию — нет, программа не компилируется.
При этом если мы нажмём на сообщение об ошибке, мы увидим,
что она у нас происходит в 14-й строке, там,
где мы выводим переменную x за пределами первых операторных скобок.
При этом вывод переменной x,
первый её вывод и второй вывод — они компилируются.
Не компилируется только третий, то есть если мы его закомментируем,
программа у нас компилируется и выведет сейчас две пятёрки.
Вот она это делает.
Что этот пример показывает?
Этот пример показывает, что переменные в C++ видны только в
том блоке операторных скобок, в котором они объявлены.
У нас переменная x объявлена в блоке операторных скобок между
7-й и 13-й строками, поэтому она видна только здесь.
Теперь просуммируем два наших примера.
Мы теперь знаем, что переменная в С++
видна после своего объявления и до конца того
блока из операторных скобок, в котором она объявлена.
Вы это можете видеть на картинке на слайде.
Теперь давайте рассмотрим более конкретные примеры.
Например, если мы
напишем условный оператор,
если 1 > 0, int x = 5, и выведем x,
то эта программа не скомпилируется,
потому что переменная x объявлена внутри тела условного оператора, внутри if.
А мы сказали, что за пределами блока операторных скобок,
где объявлена переменная, она не видна.
Вот блок операторных скобок, а здесь мы обращаемся к переменной x,
здесь она уже не видна.
То же самое у нас будет в цикле while — также это
не компилируется, и в цикле for.
Например, for
(int i = 0; i < 10; ++i).
Эта программа также не компилируется по той же самой причине.
Переменная x не видна, потому что она объявлена внутри тела цикла for.
Смотрите, какой может возникнуть вопрос: а видна ли здесь переменная i,
которую мы объявили в теле цикла?
Потому что здесь не видно никаких операторных скобок,
единственные операторные скобки,
в которых объявлены объемлющие операторные скобки этой переменной i,
это скобки нашей функции main, и поэтому можно предположить,
что переменная i видна после цикла for.
Но если мы скомпилируем нашу программу, мы поймем, что нет,
переменная i не видна после цикла for.
Это надо просто запомнить, что переменные,
которые объявлены внутри цикла for, они за пределами этого цикла не видны.
На самом деле это очень хорошо, потому что, если бы это было не так,
то в программах могли быть всяческие ошибки
из-за того, что счётчик, объявленный внутри цикла,
его имя пересекается с какой-то переменной, которая у нас уже есть.
Таким образом, запомните, что переменная,
объявленная внутри цикла for, не видна за его пределами.
Теперь давайте рассмотрим ещё один пример.
Давайте объявим переменную s типа string
и запишем в неё hello.
Откроем операторные скобки,
объявим переменную s типа string и запишем в неё world.
Теперь давайте выведем s и давайте
выведем s ещё раз.
Скомпилируем это.
Это компилируется.
То есть тут есть два варианта: либо компилятор нам запрещает во внутреннем
блоке переопределять переменную, объявленную во внешнем, либо нет.
Вот в С++ компилятор не запрещает, он говорит: ты сам понимаешь,
что ты делаешь, поэтому вперёд.
Что же у нас будет выведено?
Выведено у нас будет world hello, что логично.
Здесь в первом выводе берется та переменная, которая объявлена ближе,
то есть s, объявленная в блоке операторных скобок.
Здесь же во втором выводе в 12-й строке эта переменная s не видна.
Мы сказали, что она видна только в объемлющем блоке операторных скобок,
поэтому здесь берётся вот эта переменная s, и поэтому мы увидим слово hello.
Поэтому в C++ можно объявлять во внутреннем блоке
переменные с тем же именем, которое есть во внешнем блоке.
Но не надо так делать, потому что при чтении вашей программы
могут возникнуть проблемы с пониманием и чтением кода вашей программы.
Поэтому, несмотря на то, что компилятор разрешает вам так делать,
этого лучше не делать и каждую переменную называть каким-то уникальным образом.
Давайте подведем итоги.
В этом видео мы узнали, что в C++ переменная видна после своего объявления
и до конца того блока из операторных скобок, в котором она объявлена.
Хочется ещё раз вам напомнить, что слишком большая область видимости
переменных может приводить к ошибкам в C++, поэтому на практике
надо всегда стараться минимизировать область видимости переменных.