2016-10-18 4 views
21

Iは、次のコード例があります複数のクラスの共通の静的変数を持っている場合、それらは(同じ範囲内?)共有されている

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、(クラスAのオブジェクトである)B::a1C::a1から独立しているがあります。だから、両方B::a1.aC::a1.aA::aを参照してください。

19

あなたはここに複数のクラスを見ていません。 B::a1C::a1はいずれもAです。 Aには、2回アクセスした静的変数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 = & C :: A1(二a1が別々である)

しかし

:ただし、Aは::程度のすべてのインスタンス間で共有される静的変数であります

& B :: a1.a == & C :: a1.a(すなわち、すべて:: A Aの同じ関係なく、 '取り囲む' のインスタンスである)追加するアイ開口かもしれない

関連する問題