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)