2016-10-18 75 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; 
} 

B類和C具有A級爲靜態成員變量。

我希望程序打印「1 1」,但打印「2 2」。

如果有多個類具有共同的靜態變量,它們是共享(在同一範圍內?)

+0

這可能是眼開口,以添加對象'B b1,b2'和'C c1,c2,c3'。 – MSalters

回答

29

static members屬於類,它無關的對象。

類的靜態成員與類的對象沒有關聯:它們是具有靜態存儲持續時間的獨立對象或在命名空間範圍內定義的常規函數​​,在程序中只有一次。

爲您的代碼,只有一個A::a,這是獨立的B::a1C::a1(它是類A的對象)。所以B::a1.aC::a1.a都是指A::a

19

你沒有在這裏看到多個類。 B::a1C::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的份額a,但所有A都有自己的b。而且兩者CB有自己A

0

B和C都具有的靜態實例(它們分別爲它們的類型的對象之間共享),這些都是A的單獨的實例,將有它的成員的不同的獨立實例好。然而,A ::一個是的,以便所有實例之間共享的靜態變量:

& B :: A1 = &Ç:: A1(這兩個A1是分開的)

& B :: a1.a == &ç:: a1.a(即所有A ::一個是相同的,不管A的「封閉」實例)