Если глобальная и локальная переменные имеют одинаковые имена, то преимущество находится на стороне локальной переменной. Другими словами, локальная переменная скроет глобальную с таким же именем. Таким образом, несмотря на то, что к глобальной переменной теоретически можно получить доступ из любого кода программы, практически это возможно только в случае, если одноименная локальная переменная не переопределит глобальную.
Использование глобальных переменных демонстрируется в следующей программе. Как видите, переменные count и num_right объявлены вне всех функций, следовательно, они— глобальные. Из обычных практических соображений лучше объявлять глобальные переменные поближе к началу программы. Но формально они просто должны быть объявлены до их первого использования. Предлагаемая для рассмотрения программа— всего лишь простой тренажер по выполнению арифметического сложения. Сначала пользователю предлагается указать количество упражнений. Для выполнения каждого упражнения вызывается функция drill(), которая генерирует два случайных числа в диапазоне от 0 до 99. Пользователю предлагается сложить эти числа, а затем проверяется ответ. На каждое упражнение дается три попытки. В конце программа отображает количество правильных ответов. Обратите особое внимание на глобальные переменные, используемые в этой программе.
// Простая программа-тренажер по выполнению сложения.
#include <iostream>
#include <cstdlib>
using namespace std;
void drill();
int count; // Переменные count и num_right — глобальные.
int num_right;
int main()
{
cout << "Сколько практических упражнений: ";
cin >> count;
num_right = 0;
do {
drill(); count--;
}while(count);
cout << "Вы дали " << num_right<< " правильных ответов.\n";
return 0;
}
void drill()
{
int count; /* Эта переменная count — локальная и никак не связана с одноименной глобальной.*/
int а, b, ans;
// Генерируем два числа между 0 и 99.
а = rand() % 100;
b = rand() % 100;
// Пользователь получает три попытки дать правильный ответ.
for(count=0; count<3; count++) {
cout << "Сколько будет " << а << " + " << b << "? ";
cin >> ans;
if(ans==a+b) {
cout << "Правильно\n";
num_right++;
return;
}
}
cout << "Вы использовали все свои попытки.\n";
cout << "Ответ равен " << a+b << '\n';
}
При внимательном изучении этой программы вам должно быть ясно, что как функция main(), так и функция drill() получают доступ к глобальной переменной num_right. Но с переменной count дело обстоит несколько сложнее. В функции main() используется глобальная переменная count. Однако в функции drill() объявляется локальная переменная count. Поэтому здесь при использовании имени count подразумевается именно локальная, а не глобальная переменная count. Помните, что, если в функции глобальная и локальная переменные имеют одинаковые имена, то при обращении к этому имени подразумевается локальная, а не глобальная переменная.
Хранение глобальных переменных осуществляется в некоторой определенной области памяти, специально выделяемой программой для этих целей. Глобальные переменные полезны в том случае, когда в нескольких функциях программы используются одни и те же данные, или когда переменная должна хранить свое значение на протяжении выполнения всей программы. Однако без особой необходимости следует избегать использования глобальных переменных, и на это есть три причины.