Инструменты пользователя

Инструменты сайта


examination:oop:question46

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

Структура программы

Программа на языке С++ состоит из директив препроцессора, указаний компилятору, объявлений переменных и/или констант, объявлений и определений функций.

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

   main ( )
   {	
      //...
      //...
      return 0;
   }

Поскольку ни одна функция не может содержать определения другой функции, следом (или ранее) в тексте могут располагаться определения вспомогательных функций, «неглавных» функций. Их может быть различное количество.

   main ( )
   {  	
      //...
      return 0;
   }
   function 1 ( )
   {
      //...
   }
   function 2 ( )
   {
      //...  
   }
   //...
   function n ( )
   {
   }

Функции могут быть описаны в произвольном порядке. Удобно располагать их по алфавиту или сгруппировать по определенному признаку.

Объявление переменной

Объявление переменной задает имя и атрибуты переменной. Атрибутами переменной могут быть тип, количество элементов (для массивов), спецификация класса памяти, а также инициализатор. Инициализатор – это константа соответствующего типа, задающая значение, которое присваивается переменной при создании. Объявление переменной имеет следующий синтаксис:

[<спецификация класса памяти>] <тип> <имя> [= <инициализатор>][,<имя> [= <инициализатор>] …];

Примеры объявления переменных

int    x;	        // Объявление переменной целого типа без инициализатора
double y = exp(1);	// Переменная вещественного типа инициализируется числом e.
                        // exp(x) – функция, вычисляющая ex.
int    a, b = 0;	// Объявление двух переменных целого типа. 
                        // Переменная b инициализируется значением 0.

В языке С++ нет ограничений на количество символов в имени. Однако некоторые части реализации (в частности, компоновщик) недоступны автору компилятора, и они иногда накладывают такие ограничения.

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

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

Локальные переменные

Переменная, объявленная на внутреннем уровне, доступна только в том, блоке в котором она объявлена, независимо от класса памяти.

В языке С++ имеется четыре спецификации класса памяти:

  • auto - Переменная, объявленная на внутреннем уровне, доступна только в том, блоке в котором она объявлена, независимо от класса памяти. По умолчанию она имеет класс памяти auto. Переменные этого класса размещаются в стеке. Переменные класса памяти auto автоматически не инициализируются, поэтому в случае отсутствия инициализации в объявлении значение переменной класса памяти auto считается неопределенным.
  • register - требует, чтобы переменной была выделена память в регистре, если это возможно. Т.к. работа с регистрами происходит быстрее, спецификация класса памяти register обычно используется для переменных, к которым предполагается обращаться очень часто.
  • static - Если в объявлении переменной задана спецификация класса памяти static, то в других исходных файлах могут быть определены другие переменные с тем же именем и любым классом памяти. Эти переменные никак не буду связаны между собой.
  • extern - Спецификация класса памяти extern используется для объявления переменной, определенной где-то в другом месте программы. Такие объявления используются в случае, когда нужно распространить на данный исходный файл область видимости переменной, определенной в другом исходном файле на внешнем уровне. Область видимости переменной распространяется от места объявления до конца исходного файла. В объявлениях, которые используют спецификацию класса памяти extern, инициализация не допускается, так как они ссылаются на переменные, значения которых определены в другом месте.

Спецификации класса памяти auto и register могут быть использованы только на внутреннем уровне.

examination/oop/question46.txt · Последние изменения: 2014/01/15 12:22 (внешнее изменение)