Классы хранения в C++: область видимости, время жизни и использование
Класс хранения определяет область видимости (видимость) и время жизни переменных и/или функций в программе на C++. Эти спецификаторы предшествуют типу, который они модифицируют. В C++ есть следующие классы хранения:
- auto
- register
- static
- extern
- mutable
Класс хранения auto
Класс хранения auto — это класс хранения по умолчанию для всех локальных переменных.
{ int mount; auto int month; }
В примере две переменные с одинаковым классом хранения. auto можно использовать только внутри функций, то есть для локальных переменных.
Класс хранения register
Класс хранения register используется для определения локальных переменных, которые должны храниться в регистре процессора, а не в ОЗУ. Это означает, что переменная имеет максимальный размер, равный размеру регистра (обычно одно машинное слово), и к ней нельзя применить унарный оператор & (так как у неё нет адреса в памяти).
{ register int miles; }
register следует использовать только для переменных, требующих быстрого доступа, например счётчиков. Также важно: указание register не гарантирует размещение в регистре — это лишь подсказка компилятору, решение зависит от железа и реализации.
Класс хранения static
Класс хранения static указывает компилятору сохранять локальную переменную в существовании на протяжении всего времени жизни программы, а не создавать и уничтожать её при каждом входе и выходе из области видимости. Таким образом, статические локальные переменные сохраняют свои значения между вызовами функции.
Модификатор static также можно применять к глобальным переменным. В этом случае область видимости переменной ограничивается файлом, в котором она объявлена.
В C++, когда static используется для элемента данных класса, это приводит к тому, что только одна копия этого элемента совместно используется всеми объектами класса.
#include <iostream>
// Объявление функции
void func(void);
static int count = 10; /* Глобальная переменная */
main() {
while(count--) {
func();
}
return 0;
}
// Определение функции
void func(void) {
static int i = 5; // локальная статическая переменная
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 объявляет глобальную переменную или функцию в другом файле.
Модификатор 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. Запустите write и проверьте результат:
$ ./write 5
Класс хранения mutable
Спецификатор mutable применяется только к объектам классов, которые обсуждаются позже в этом руководстве. Он позволяет члену объекта переопределять const функцию-член. То есть mutable член может быть изменён const функцией-членом.
Язык C
- Освоение операторов C++: полное руководство с практическими примерами
- Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
- Дружественные функции и классы в C++: мастерство контроля доступа
- Шаблоны классов в C++: практическое руководство
- Классы хранения в C: область видимости, время жизни и производительность
- Классы хранения в C: auto, register, static, extern — область видимости и время жизни
- Полиморфизм в C++: практическое руководство
- Абстракция данных в C++: разделение интерфейса и реализации
- Инкапсуляция данных в C++: защита вашего кода
- Интерфейсы в C++: абстрактные классы и чисто виртуальные функции