Классы хранения в C ++
Класс хранения определяет область видимости и время жизни переменных и / или функций в программе C ++. Эти спецификаторы предшествуют типу, который они изменяют. Существуют следующие классы хранения, которые можно использовать в программе на C ++.
- auto
- register
- static
- extern
- mutable
Класс автоматического хранения
В auto класс хранения - это класс хранения по умолчанию для всех локальных переменных.
{
int mount;
auto int month;
}
В приведенном выше примере определяются две переменные с одним и тем же классом хранения, auto можно использовать только внутри функций, то есть локальных переменных.
Класс хранения регистра
В registerкласс хранения используется для определения локальных переменных, которые должны храниться в регистре вместо ОЗУ. Это означает, что переменная имеет максимальный размер, равный размеру регистра (обычно одно слово), и к ней не может быть применен унарный оператор '&' (поскольку она не имеет ячейки памяти).
{
register int miles;
}
Регистр следует использовать только для переменных, требующих быстрого доступа, таких как счетчики. Также следует отметить, что определение «регистра» не означает, что переменная будет храниться в регистре. Это означает, что он МОЖЕТ быть сохранен в регистре в зависимости от аппаратных и реализационных ограничений.
Статический класс хранения
В staticкласс хранилища инструктирует компилятор поддерживать локальную переменную в существовании в течение всего времени жизни программы вместо того, чтобы создавать и уничтожать ее каждый раз, когда она входит в область видимости и выходит за ее пределы. Следовательно, статизация локальных переменных позволяет им сохранять свои значения между вызовами функций.
Модификатор 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класс хранилища используется для указания ссылки на глобальную переменную, которая видна ВСЕМ программным файлам. Когда вы используете 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 используется для объявления счетчика в другом файле. Теперь скомпилируйте эти два файла следующим образом -
$g++ main.cpp support.cpp -o write
Это произведет write исполняемая программа, попробуйте выполнить write и проверьте результат следующим образом -
$./write
5
Изменяемый класс хранения
В mutableспецификатор применяется только к объектам класса, которые обсуждаются позже в этом руководстве. Он позволяет члену объекта переопределять константную функцию-член. Таким образом, изменяемый член может быть изменен константной функцией-членом.