c++ - una - variable static java
Si varias clases tienen una variable estática en común, ¿se comparten(dentro del mismo ámbito?) (3)
Tengo el siguiente código de ejemplo:
class A {
public:
static int a;
};
int A::a = 0;
class B {
public:
static A a1;
};
A B::a1;
class C {
public:
static A a1;
};
A C::a1;
int main(int argc, const char * argv[]) {
C::a1.a++;
B::a1.a++;
std::cout << B::a1.a << " " << C::a1.a << std::endl;
return 0;
}
Las clases B y C tienen clase A como variable miembro estática.
Esperaba que el programa imprimiera "1 1", pero imprime "2 2".
Si varias clases tienen una variable estática en común, ¿se comparten (dentro del mismo ámbito?)
B y C tienen instancias estáticas de A, estas son instancias separadas de A y también tienen diferentes instancias separadas de sus miembros. Sin embargo, A :: a es una variable estática que se comparte entre todas las instancias de A así:
& B :: a1! = & C :: a1 (los dos a1 están separados)
pero
& B :: a1.a == & C :: a1.a (es decir, todas las A :: a son iguales, sin importar la instancia ''adjunta'' de A)
Los miembros estáticos pertenecen a la clase, no tiene nada que ver con los objetos.
Los miembros estáticos de una clase no están asociados con los objetos de la clase: son objetos independientes con duración de almacenamiento estático o funciones regulares definidas en el ámbito del espacio de nombres, solo una vez en el programa.
Para su código, solo hay un A::a , que es independiente de B::a1 y C::a1 (que son objetos de clase A ). Entonces, tanto B::a1.a como C::a1.a refieren a A::a .
No estás viendo múltiples clases aquí. Tanto B::a1 como C::a1 son de tipo A Y A tiene una variable estática a , a la que accedió dos veces. Si también escribió A::a++ , su programa habría impreso 3 3
Para modificar tu ejemplo ligeramente:
struct A
{
static int a;
int b;
};
int A::a;
struct B
{
static A a1;
};
A B::a1{0};
struct C
{
static A a2;
};
A C::a2{0};
y el código de usuario:
B::a1.a = 1; // A''s static variable changed
B::a1.b = 2; // B''s A''s b changed to 2
cout << B::a1.a << ", " << B::a1.b << endl;
cout << C::a2.a << ", " << C::a2.b << endl;
Se imprimirá:
1, 2
1, 0
Eso es porque todos los A comparten a , pero todos los A tienen su propio b . Y tanto C como B tienen su propia A (que comparten respectivamente entre los objetos de su tipo)