Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lekcii_1_10 / Лекция 07.docx
Скачиваний:
74
Добавлен:
21.05.2015
Размер:
328.19 Кб
Скачать

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

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

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

Использование глобальных переменных демонстрируется в следующей программе. Как видите, переменные 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. Помните, что, если в функции глобальная и локальная переменные имеют одинаковые имена, то при обращении к этому имени подразумевается локальная, а не глобальная переменная.

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

■ Они занимают память в течение всего времени выполнения программы, а не только тогда, когда действительно необходимы.

■ Использование глобальной переменной в "роли", с которой легко бы "справилась" локальная переменная, делает такую функцию менее универсальной, поскольку она полагается на необходимость определения данных вне этой функции.

■ Использование большого количества глобальных переменных может привести к появлению ошибок в работе программы, поскольку при этом возможно проявление неизвестных и нежелательных побочных эффектов. Основная проблема, характерная для разработки больших С++-программ, — случайная модификация значения переменной в каком-то другом месте программы. Чем больше глобальных переменных в программе, тем больше вероятность ошибки.

Соседние файлы в папке lekcii_1_10