Я чувствую, что стоит добавить, что статическая переменная - это не то же самое, что постоянная переменная.
с использованием постоянной переменной в классе
struct Foo{
const int a;
Foo(int b) : a(b){}
}
и мы объявили бы это примерно так
fooA = new Foo(5);
fooB = new Foo(10);
// fooA.a = 5;
// fooB.a = 10;
Для статической переменной
struct Bar{
static int a;
Foo(int b){
a = b;
}
}
Bar::a = 0; // set value for a
который используется вот так
barA = new Bar(5);
barB = new Bar(10);
// barA.a = 10;
// barB.a = 10;
// Bar::a = 10;
Вы видите, что здесь происходит. Постоянная переменная, которая создается вместе с каждым экземпляром Foo, поскольку создается экземпляр Foo, имеет отдельное значение для каждого экземпляра Foo и не может быть изменена Foo вообще.
Где, как и в случае с Bar, они имеют только одно значение для Bar :: независимо от того, сколько экземпляров Bar сделано. Все они разделяют это значение, вы также можете получить к нему доступ, так как они являются любыми экземплярами Bar. Статическая переменная также соблюдает правила для public / private, так что вы можете сделать так, чтобы только экземпляры Bar могли читать значение Bar :: a;