Программирование >>  Инициализация объектов класса, структура 

1 ... 121 122 123 [ 124 ] 125 126 127 ... 395


const int notFound = -1; глобальная область видимости int binSearch( const vector<int> &vec, int val ) { локальная область видимости: уровень #1 int low = 0;

int high = vec.size() - 1;

while ( low <= high )

{ локальная область видимости: уровень #2 int mid = ( low + high ) / 2; if ( val < vec[ mid ] )

high = mid - 1; else low = mid + 1;

return notFound; локальная область видимости: уровень #1 (функция выполняет двоичный поиск в отсортированном векторе целых чисел):

Первая локальная область видимости - тело функции binSearch() . В ней объявлены параметры функции vec и val, а также переменные low и high. Цикл while внутри функции задает вложенную локальную область, в которой определена одна переменная mid. Параметры vec и val и переменные low и high видны во вложенной области. Глобальная область видимости включает в себя обе локальных. В ней определена одна целая константа notFound.

Имена параметров функции vec и val принадлежат к первой локальной области видимости тела функции, и в ней использовать те же имена для других сущностей нельзя.

int binSearch( const vector<int> &vec, int val ) { локальная область видимости: уровень #1

int val; ошибка: неверное переопределение val

Например:

...

Имена параметров употребляются как внутри тела функции binSearch() , так и внутри вложенной области видимости цикла while. Параметры vec и val недоступны вне тела функции binSearch() .

Разрешение имени в локальной области видимости происходит следующим образом: просматривается та область, где оно встретилось. Если объявление найдено, имя разрешено. Если нет, просматривается область видимости, включающая текущую. Этот

Области видимости и разрешение имен - понятия времени компиляции. Они применимы к отдельным частям текста программы. Компилятор интерпретирует текст программы согласно правилам областей видимости и правилам разрешения имен.

8.1.1. Локальная область видимости

Локальная область видимости - это часть исходного текста программы, содержащаяся в определении функции (или блоке внутри тела функции). Все функции имеют свои локальные области видимости. Каждая составная инструкция (или блок) внутри функции также представляет собой отдельную локальную область. Такие области могут быть вложенными. Например, следующее определение функции содержит два их уровня



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 ) элемент найден

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

представление компилятора { невидим блок int index = 0;

for ( ; index < vecSize; ++index ) {

...

в виде:

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

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



int index = 0;

for ( ; index < vecSize; ++index ) {

...

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

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

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

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

void fooBar( int *ia, int sz ) {

for (int i=0; i<sz; ... правильно

for (int i=0; i<sz; ... правильно,

for (int i=0; i<sz; ... правильно,

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

Аналогично переменная может быть объявлена внутри условия инструкций if и switch,

if ( int *pi = getValue() ) {

pi != 0 - *pi можно использовать здесь

int result = calc(*pi);

...

else {

здесь pi тоже видна

pi == 0

cout << ошибка: getValue() завершилась неудачно << endl;

а также внутри условия циклов while и for. Например:

Переменные, определенные в условии инструкции if, как переменная pi, видны только внутри if и соответствующей части else, а также во вложенных областях. Значением условия является значение этой переменной, которое она получает в результате инициализации. Если pi равна 0 (нулевой указатель), условие ложно и выполняется ветвь else. Если pi инициализируется любым другим значением, условие истинно и выполняется ветвь if. (Инструкции if, switch, for и while рассматривались в главе 5.)

Упражнение 8.1

Найдите различные области видимости в следующем примере. Какие объявления ошибочны и почему?

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



1 ... 121 122 123 [ 124 ] 125 126 127 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика