variable una que programacion poo metodos metodo ejemplos ejemplo clases clase atributos atributo c++ static static-members

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)