С++ для начинающих



         

Локальная область видимости - часть 2


Из-за порядка просмотра областей видимости в процессе разрешения имен объявление из внешней области может быть скрыто объявлением того же имени во вложенной области. Если бы в предыдущем примере переменная low была объявлена в глобальной области видимости перед определением функции binSearch(), то использование low в локальной области видимости цикла while все равно относилось бы к локальному объявлению, скрывающему глобальное:

int low;

int binSearch( const vector<int> &vec, int val )

{

    // локальное объявление low

    // скрывает глобальное объявление

    int low = 0;

    // ...

    // low - локальная переменная

    while ( low <= high )

    {//...

    }

    // ...

}

Для некоторых инструкций языка C++ разрешено объявлять переменные внутри управляющей части. Например, в цикле for переменную можно определить внутри инструкции инициализации:

for ( int index = 0; index < vecSize; ++index )

{

    // переменная index видна только здесь

    if ( vec[ index ] == someValue )

        break;

}

// ошибка: переменная index не видна

if ( index != vecSize ) // элемент найден

Подобные переменные видны только в локальной области самого цикла for и вложенных в него (это верно для стандарта С++, в предыдущих версиях языка поведение было иным). Компилятор рассматривает это объявление так же, как если бы оно было записано в виде:

// представление компилятора

{  // невидимый блок

    int index = 0;

    for ( ; index < vecSize; ++index )

    {

      // ...

    }

}

Тем самым программисту запрещается применять управляющую переменную вне локальной области видимости цикла. Если нужно проверить index, чтобы определить, было ли найдено значение, то данный фрагмент кода следует переписать так:

int index = 0;

for ( ; index < vecSize; ++index )

{

    // ...

}

// правильно: переменная index видна

if ( index != vecSize ) // элемент найден

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




Содержание  Назад  Вперед