Введение

В этой части серии статей о программировании на C++ мы будем изучать области видимости и то, как C++ определяет видимость и доступность идентификаторов в программе. Понимание областей видимости имеет решающее значение для написания чистого и организованного кода.

В этой части нашего путешествия по программированию на C++ мы рассмотрим следующие темы:

  • Местный охват
  • Глобальный охват
  • Приоритет имени

Прежде чем мы начнем, важно отметить, что эта серия статей предполагает базовое понимание концепций программирования. Если вы новичок в программировании, может быть полезно сначала изучить основы.

Категории области

В C++ есть две основные категории области видимости:

Местный охват

Локальная область относится к диапазону доступности идентификатора, объявленного внутри блока. Он начинается с точки объявления и продолжается до конца этого блока.

Блок может быть:

  • Тело функции
  • Петля
  • Любой заключенный набор операторов в фигурных скобках.

Идентификаторы с локальной областью действия доступны только в пределах блока, в котором они определены. После завершения блока идентификаторы больше не доступны.

Пример локальной области действия

Рассмотрим следующий фрагмент кода:

int x; 
while (x < 0) { 
 int y; 
 cin >> y; 
 x = x + y;
}

В этом примере переменная y объявляется внутри цикла while. Следовательно, его область действия локальна по отношению к телу цикла. Это означает, что на y можно ссылаться только внутри цикла, и он перестанет существовать после завершения цикла.

Глобальный охват

Область действия идентификатора, объявленного вне всех блоков, простирается от точки объявления до конца всего файла. Доступ к идентификаторам с глобальной областью действия можно получить из любой части программы ниже их объявления, включая внутренние функции и другие блоки. Это работает очень похоже на Python.

Пример глобального охвата

Рассмотрим следующий фрагмент кода:

double d; 
int main() { 
 int y = 0; 
 cin >> d; 
 if (d < 0) { 
  d = y; 
 } 
}

В этом случае идентификатор d объявлен вне каких-либо блоков, что дает ему глобальную область действия. На него можно ссылаться в любом месте программы после его объявления, в том числе внутри функции main и тела оператора if.

Приоритет имени

Когда внутренний блок объявляет локальный идентификатор с тем же именем, что и идентификатор во внешнем блоке, внутренний идентификатор имеет приоритет. Это означает, что внутренний идентификатор «скрывает» или «затеняет» внешний, делая его недоступным внутри внутреннего блока. Например:

double d = 1.2;
int main() {
  double d = 3.5;
  cout << d; // Output: 3.5
}

В этом случае внутренняя переменная d, объявленная в main, имеет приоритет над внешней переменной d. Следовательно, при печати d отображается значение внутреннего d.

Понимание приоритета имен жизненно важно, чтобы избежать путаницы и обеспечить правильный доступ к предполагаемым идентификаторам в коде.

Подведение итогов

В этой части нашей серии статей по программированию на C++ мы углубились в важную тему областей видимости. Области определяют видимость и доступность идентификаторов в программе, обеспечивая организованный и бесконфликтный код. Давайте подытожим то, что мы обсуждали:

  • Локальная область действия. Мы выяснили, как идентификаторы, объявленные внутри блока, такие как тело функции или цикл, имеют ограниченную область действия.
  • Глобальная область действия. Доступ к идентификаторам с глобальной областью действия можно получить из любой части программы ниже их объявления, что обеспечивает удобство, но также вызывает опасения относительно сокрытия и инкапсуляции информации.
  • Приоритет имени: мы узнали, что внутренний идентификатор имеет приоритет над внешним, что приводит к потенциальным конфликтам и необходимости тщательного управления для обеспечения правильного доступа к предполагаемым идентификаторам.