2016-10-18 5 views
21

У меня есть следующий пример кода (в пределах той же области?):Если несколько классов имеют статическую переменную общего, они совместно

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; 
} 

класса В и С имеют класс А в качестве статической переменной члена.

Я ожидал, что программа напечатает «1 1», однако печатает «2 2».

Если несколько классов имеют статическую переменную в общем, они разделяют (в том же объеме?)

+0

Это может быть поучительным, чтобы добавить объекты 'B b1, b2' и' C c1, c2, c3'. – MSalters

ответ

29

The static members принадлежат к классу, он не имеет ничего общего с объектами.

Статические элементы класса не связаны с объектами класса: они являются независимыми объектами со статическим временем хранения или регулярными функциями, определенными в области пространства имен, только один раз в программе.

Для вашего кода, есть только один A::a, который не зависит от B::a1 и C::a1 (которые являются объектами класса A). Поэтому оба B::a1.a и C::a1.a относятся к A::a.

19

Вы не смотрите на несколько классов здесь. Оба B::a1 и C::a1 имеют тип A. И A имеет статическую переменную a, к которой вы дважды обращались. Если вы написали A::a++, ваша программа будет напечатали 3 3

Чтобы немного изменить свой пример:

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}; 

и код пользователя:

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; 

Это будет печатать:

1, 2 
1, 0 

Это потому, что все A s доля a, но все A s имеют свои собственные b. И оба C и B имеют свои собственные A (что они соответственно поделены между объектами их типа)

0

В и С и имеют статические экземпляры, они являются отдельными экземплярами и будут иметь различные раздельные экземпляры ее члены как Что ж. Однако, A :: а является статическим переменным, которая распределяется между всеми экземплярами так:

& B :: a1 = & C :: a1 (два a1 являются самостоятельными)

но

& B :: a1.a == & C :: a1.a (т.е. всех A :: а является тем же, независимо от того, '' ограждающего экземпляра A)