ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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().
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
