Меню сайта

Урок 12. Локальные переменные и область видимости в C++


ОБЪЯВЛЕНИЕ ЛОКАЛЬНЫХ ПЕРЕМЕННЫХ

Локальная переменная -представляет собой переменную, определенную внутри функции. Такая переменная называется —локальной, -потому что ее известность ограничена данной функцией. Вы объявляете локальные переменные в начале функции после открывающей фигурной скобки:

void some_function(void)

{
— — -int count-
— — -float result-
}

Следующая программа USEBEEPS.CPP использует функцию sound_speaker, -которая заставляет играть встроенный компьютерный динамик столько раз, сколько указано параметромbeeps. -Внутри функции sound_speaker локальная -переменнаяcounter -хранит количество звуков, издаваемых динамиком:

#include &lt-iostream.h&gt-

void sound_beeps(int beeps)

{
— — -for (int counter = 1- counter &lt-= beeps- counter++) cout &lt-&lt- «a»-
}

void main(void)

{
— — -sound_beeps(2)-
— — -sound_beeps(3)-
}

Как видите, функцияsound_beeps -объявляет переменнуюcounter -сразу же после открывающей фигурной скобки. Посколькуcounter -определяется внутри функцииsound_beeps, -эта переменная является локальной по отношению к —sound_beeps, -и это означает, что только —sound_beeps -знает об этой переменной и может к ней обращаться.

О конфликте имен

При объявлении локальных переменных внутри функции очень вероятно, что имя локальной переменной, объявляемой вами в одной функции, будет таким же, -как и имя переменной, используемой в другой функции. Как уже упоминалось, локальные переменные известны только в текущей функции. Таким образом, если две функции используют одно и то же имя для своих локальных переменных, это не приводит к конфликту. C++ трактует имя каждой переменной как локальное по отношению к соответствующей функции.Следующая программа LCLNAME.CPP использует функциюadd_values -для сложения двухцелочисленных значений. Эта функция присваивает свой результат локальной переменнойvalue. -Однако вmain -один из параметров, передаваемых в функцию, также носит имяvalue.Тем не менее, поскольку C++ трактует обе переменные как локальные для соответствующих функций, их имена не конфликтуют:

#include &lt-iostream.h&gt-

int add_values(int a, int b)
{
— — -int value-

— — -value =a + b-
— — -return(value)-
}

void main (void)

{
— — -int value = 1001-
— — -int other value = 2002-
— — -cout &lt-&lt- value &lt-&lt- » + » &lt-&lt- other_value &lt-&lt- —« -= » &lt-&lt- add_values(value, other_value) &lt-&lt- endl-
}

О локальных переменных

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


ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ

Как вы уже знаете, локальная переменная объявляется и известна только в определенной функции. В дополнение к локальным переменным C++ позволяет вашим программам объявлять —глобальные переменные, —которые известны на протяжении всей программы (глобально для всех функций). Чтобы объявить глобальную переменную, следует просто поместить объявление переменной в начало вашей программы вне какой-либо функции:

int some_global_variable- — — — — — — — — — — — — — — — — —-&gt- —Объявление глобальной переменной

void main(void)

{
— — -// Здесь должны быть операторы программы
}

Следующая программа GLOBAL. CPP использует глобальную переменную именемnumber.Каждая функция в программе может использовать (или изменять) значение глобальной переменной. В данном случае каждая функция выводит текущее значение этой переменной, а затем увеличивает это значение на единицу:

#include &lt-iostream.h&gt-

int number = 1001-

void first_change(void)

(
— — -cout &lt-&lt- «значение number в first_cbange » &lt-&lt- number &lt-&lt- endl-
— — -number++-
}

void second_change(void)

{
— — -cout &lt-&lt- «значение number в second_change » &lt-&lt- number &lt-&lt- endl-
— — -number++-
}

void main(void)

{
— — -cout &lt-&lt- «значение number в main » &lt-&lt- number &lt-&lt- endl-
— — -number++-
— — -first_change () —
— — -second_change()-
}

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

Если имена глобальных и локальных переменных конфликтуют

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

Однако могут быть ситуации, когда вам необходимо обратиться к глобальной переменной, чье имя конфликтует с именем локальной переменной. В таких случаях ваши программы могут использовать —глобальный —оператор —разрешения -С++ (::), если вы хотите использовать глобальную переменную. Например, предположим, что у вас есть глобальная и локальная переменные с именемnumber. -Если ваша функция хочет использовать локальную переменнуюnumber, -она просто обращается к этой переменной, как показано ниже:

number = 1001- // обращение к локальной переменной

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

::number = 2002- // Обращение к глобальной переменной

Следующая программа GLOBLOCA.CPP использует глобальную переменнуюnumber. -В дополнение к этому функцияshow_numbers -использует локальную переменную с именемnumber. -Эта функция использует оператор глобального разрешения для обращения к глобальной переменной:

#include &lt-iostream.h&gt- int number = 1001- // Глобальная переменная

void show_numbers(int number)

{
— — -cout &lt-&lt- «Локальная переменная number» &lt-&lt- » содержит » &lt-&lt- number &lt-&lt- endl-
— — -cout &lt-&lt- «Глобальная переменная number» &lt-&lt- » содержит » &lt-&lt- ::number &lt-&lt- endl-
}

void main(void)
{
— — -int some_value = 2002-
— — -show_numbers(some_value) —
}

Когда вы откомпилируете и запустите эту программу, на вашем экране появится следующий вывод:

С:&gt- GLOBLOCA &lt-ENTER&gt-

Локальная переменная number содержит 2002

Глобальная переменная number содержит 1001

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

О глобальных переменных

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


Представление об области видимости переменных

При чтении книг и журнальных статей по C++ вы можете встретить термин —область видимости, -что определяет участок в программе, где имя переменной имеет смысл (и, следовательно, используется). Для локальной переменной область видимости ограничена функцией, внутри которой эта переменная объявлена. С другой стороны, глобальные переменные известны на протяжении всей программы. В результате глобальные переменные имеют большую область видимости.


ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ

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

    1. Локальные переменные представляют собой переменные, объявленные внутри функции.
    2. Локальные переменные известны только той функции, внутри которой они объявлены.
    3. Несколько функций могут использовать одно и то же имя для локальной переменной без каких-либо конфликтов.
    4. Глобальная переменная представляет собой переменную, чье имя и значение известны на протяжении всей программы.
    5. Чтобы объявить глобальную переменную, объявите переменную в начале вашего исходного файла вне какой-либо функции.
    6. Поскольку глобальные переменные могут быть легко изменены любой функцией, они привносят возможность появления трудно обнаруживаемьгх ошибок, поэтому избегайте использования глобальных переменных в своих программах.

Категория: Обучение C++ | Дата: 05.04.13

Меню раздела
Блок