static
имеет несколько независимых значений, в зависимости от контекста.
void f() { ... }
static void g() { ... }
Здесь f
имеет «внешнюю связь», что означает, что его имя видно в других единицах перевода. То есть в другом исходном файле у вас может быть void f();
, а затем вы можете вызвать функцию f
.
g
, с другой стороны, поскольку он помечен static
, имеет "внутреннюю связь". Вы можете вызвать его из кода в том же исходном файле, но вы не можете вызвать его из другого исходного файла.
То же самое для объектов:
int i = 3; // external linkage
static int j = 4; // internal linkage
И небольшая сложность: вы можете определить статический объект внутри функции.
void f() {
static int i = 3;
std::cout << i << '\n';
++i;
}
Здесь i
не имеет нет связи. Это видно только внутри функции. Он инициализируется при первом вызове функции (и вообще не инициализируется, если функция не вызывается). Таким образом, при первом вызове f
в консоль будет записано «3». При втором вызове он напишет «4» и т. д. Понимание поведения объектов с деструкторами оставляем читателю в качестве упражнения.
Внутри определения класса все совершенно по-другому.
class C {
public:
void f();
static void g();
int i;
static int j;
};
Здесь, когда вы вызываете f
, вы должны вызывать его для объекта типа C
, а f
может использовать элементы данных этого объекта, то есть он может просматривать и изменять как i
, так и j
. Когда вы вызываете g
, нет связанного объекта. Он по-прежнему является членом C
, поэтому может просматривать и изменять j
, поскольку j
тоже не связан ни с одним объектом. Есть только один j
, и он используется всеми объектами типа C
.
person
Pete Becker
schedule
09.10.2018
static
вы не можете просто добавить или удалить его, не нарушая другой код или полностью не изменяя значение переменной, т.е. это решение, которое вы принимаете заранее, а не тогда, когда переменная уже находится в место - person 463035818_is_not_a_number   schedule 09.10.2018