Unetway

C++ - Классы хранения

Класс хранения определяет область видимости и продолжительность жизни переменных и / или функций в программе C ++. Эти спецификаторы предшествуют типу, который они изменяют. Существуют следующие классы хранения, которые могут использоваться в программе на C ++

  • auto
  • register
  • static
  • extern
  • mutable

Автомобильный класс хранения

Класс auto хранения - это класс хранения по умолчанию для всех локальных переменных.

{
   int mount;
   auto int month;
}

В приведенном выше примере определяются две переменные с одним и тем же классом хранения, auto может использоваться только в пределах функций, то есть локальных переменных.

Класс хранения регистров

Класс хранения register используется для определения локальных переменных, которые должны храниться в регистре вместо ОЗУ. Это означает, что переменная имеет максимальный размер, равный размеру регистра (обычно одно слово) и не может быть применен к нему унарный оператор «&» (так как он не имеет ячейки памяти).

{
   register int  miles;
}

Регистр должен использоваться только для переменных, требующих быстрого доступа, таких как счетчики. Следует также отметить, что определение «register» не означает, что переменная будет сохранена в регистре. Это означает, что он МОЖЕТ быть сохранен в регистре в зависимости от ограничений на оборудование и реализацию.

Статический класс хранения

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

Статический модификатор также может применяться к глобальным переменным. Когда это будет сделано, это приведет к тому, что область переменной будет ограничена файлом, в котором она объявлена.

В C ++, когда static используется для элемента данных класса, он вызывает только одну копию этого члена для общего доступа всеми объектами своего класса.

#include <iostream>
 
// Function declaration
void func(void);
 
static int count = 10; /* Global variable */
 
main() {
   while(count--) {
      func();
   }
   
   return 0;
}

// Function definition
void func( void ) {
   static int i = 5; // local static variable
   i++;
   std::cout << "i is " << i ;
   std::cout << " and count is " << count << std::endl;
}

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

i is 6 and count is 9
i is 7 and count is 8
i is 8 and count is 7
i is 9 and count is 6
i is 10 and count is 5
i is 11 and count is 4
i is 12 and count is 3
i is 13 and count is 2
i is 14 and count is 1
i is 15 and count is 0

Внешний класс хранения

Класс extern storage используется для указания ссылки на глобальную переменную, которая видна для ВСЕХ файлов программы. Когда вы используете «extern», переменная не может быть инициализирована, поскольку все, что она делает, указывает имя переменной в ранее определенном месте хранения.

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

Модификатор extern наиболее часто используется, когда есть два или более файла, которые используют одни и те же глобальные переменные или функции, как описано ниже.

Первый файл: main.cpp

#include <iostream>
int count ;
extern void write_extern();
 
main() {
   count = 5;
   write_extern();
}

 Второй файл: support.cpp

#include <iostream>

extern int count;

void write_extern(void) {
   std::cout << "Count is " << count << std::endl;
}

Здесь ключевое слово extern используется для объявления count в другом файле. Теперь скомпилируйте эти два файла следующим образом:

$g++ main.cpp support.cpp -o write

Это даст написать исполняемую программу, попытайтесь выполнить запись и проверьте результат следующим образом:

$./write
5

Изменчивый класс хранения

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