ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 5) онлайн

Глобальные переменные

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

Следующая программа под именем EXTERN демонстрирует использование гло- бальной переменной тремя функциями.

// extern.cpp

// демонстрирует глобальные переменные #include  <iostream> using namespace std;

#include  <conio.h>       // для getch()

char ch = 'a';       // глобальная переменная ch

void getachar();               // прототипы функций

void putachar();

int main() {

while( ch != '\r' )              // main()использует значение ch

{

getachar(); putachar();

}

cout << endl; return 0;

}

// --------------------------------------------------------

void getachar()

{              // getachar()использует значение ch

  ch = getch();

}

// --------------------------------------------------------

void putachar()

{              // putachar() использует значение ch

  cout << ch;

}

Одна из функций, getachar(), считывает символы с клавиатуры. Она исполь- зует библиотечную функцию getch(), действие которой напоминает функцию getche() с той разницей, что getch() не отображает вводимые символы на экране. Другая функция, putachar(), отображает вводимые символы на экране. Таким образом, вы видите на экране все символы, которые вы ввели, например

Я сижу за компьютером и набираю этот текст

Особенностью данной программы является то, что переменная ch не при- надлежит какой-либо из функций, а определяется в начале файла, перед объяв- лениями функций. Переменная ch является глобальной, или внешней. Любая функция, определенная позднее, чем переменная ch, имеет к ней достуn; в слу- чае нашей программы, доступ к переменной ch имеют все три функции: main(), getachar() и putachar(). Таким образом, областью видимости переменной ch явля- ется весь исходный файл.

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

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

Инициализация

Если глобальная переменная инициализируется явно, как показано ниже: int exvar = 199;

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

int exvar;

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

Область видимости и время жизни

Глобальные переменные имеют статический класс памяти, что означает их су- ществование в течение всего времени выполнения программы. Память под эти переменные выделяется в начале выполнения программы и закрепляется за ними вплоть до завершения программы. Для того чтобы глобальные пере- менные были статическими, не обязательно указывать в их определении ключе- вое слово static: статический класс памяти определен для этих переменных по умолчанию.

Как мы говорили, глобальные переменные видимы от места своего объявле- ния до конца того файла, в котором они определены. Если бы переменная ch была определена между функциями main() и getachar(), то она была бы видна из функций getachar() и putachar(), но не была бы видна из функции main().

 

31