Первыми рассмотрим глобальные переменные и функции. Мы
помним, что глобальные переменные и функции, доступны из любого места программы,
и что самое важное в этом примере – из других файлов нашей программы, если мы
разделим код на несколько файлов для удобства. Но если мы объявим их как
статические (static),
то тем самым сузим их видимость до текущего файла. И это может быть полезным,
если мы хотим ограничить их видимость, например, в пределах библиотеки, которую
создаем для других пользователей. Ведь когда мы подключаем сторонние библиотеки
к своей программе, то получаем доступ к ее глобальным переменным и функциям, но
не к тем, которые объявлены как статические.
Далее рассмотрим локальные переменные и функции. С
ними все тоже самое, только видимость ограничивается не рамками файла, а тем
пространством имен, в котором эти функции объявлены. Например, рамками внешней
функции, по отношению к которой наши локальные члены являются внутренними.
#include <iostream>
void foo() {
static int count = 0;
count++;
std::cout << "count is " << count << "\n";
}
int main() {
for (auto i = 0; i != 3; i++) {
foo();
}
return 0;
}
Output:
>>count is 1
>>count is 2
>>count is 3
void foo() {
static int count = 0;
count++;
std::cout << "count is " << count << "\n";
}
int main() {
for (auto i = 0; i != 3; i++) {
foo();
}
return 0;
}
Output:
>>count is 1
>>count is 2
>>count is 3
До этого момента, мы говорили про переменные простых типов,
которые также включают указатели. Т.е. указатели тоже могут быть статическими
или автоматическими. Теперь давайте поговорим о пользовательских типах в контексте статической памяти.
Статические поля классов. Если поле класса объявлено
как статическое, то это значит, что значение этого поля может быть сохранено и доступно
для чтения и редактирования между объектами этого класса. И тут интересный
момент, помните мы говорили про инициализацию статической переменной один раз
при объявлении? Статическое поле нужно инициализировать за пределами класса. Так как оно должно существовать до появления объектов класса. Обращение к нему
осуществляется через имя класса и оператор области видимости (::).
Статические методы классов. В свою очередь, если мы
имеем статический метод класса, то для его вызова нам НЕ нужно создавать объект
класса. Вызов такого метода осуществляется через имя класса и оператор области
видимости (::). Это удобно для создания утилитарных классов с наборами общих вспомогательных
методов. А также для других случаев, про которые мы поговорим в следующий раз.
Статические объекты классов. В этом случае ситуация
схожа с переменными простых типов, не будем повторяться.
#include <iostream>
class Box {
public:
Box(){
count++;
std::cout << "count is " << count << "\n";
}
~Box() = default;
static int count;
};
int Box::count = 0;
int main() {
Box b1;
Box b2;
Box b3;
return 0;
}
Output:
>>count is 1
>>count is 2
>>count is 3
class Box {
public:
Box(){
count++;
std::cout << "count is " << count << "\n";
}
~Box() = default;
static int count;
};
int Box::count = 0;
int main() {
Box b1;
Box b2;
Box b3;
return 0;
}
Output:
>>count is 1
>>count is 2
>>count is 3
Перегуд В.
No comments:
Post a Comment