2012-03-13 2 views
0

クラスの静的メンバー変数とクラスの "body"で定義された "空き"変数の違いは何ですか?私は、最初のクラスの代わりに2番目のクラスを使用してクラスのヘッダーを排出することはできますか?ヘッダーから静的メンバーを削除する

// b.h 
class B 
{ 
public: 
    B(int j); 
    void print(); 
private: 
    static int is; 
}; 


//b.cpp 
#include <iostream> 

int i = 0; 
int B::is = 0; 

B::B(int j) 
{ 
    i = j; 
    is = j; 
} 

void B::print(){ 
    std::cout << i << " " << is << " " << std::endl; 
} 

//main.cpp 
int main() { 
    B b1(1); 
    b1.print(); 
    B b2(2); 
    b2.print(); 
    b1.print(); 
    return 0; 
} 

出力:あなたのケースで

1 1 
2 2 
2 2 

答えて

2

、違いは、それがクラスのprivateセクションで宣言される静的メンバデータは、唯一のクラスによってアクセスすることができることであるかもしれません場合によっては望ましいことがあります。グローバルiは誰でも変更できます。

変数がクラスのみに使用され、他の人が使用しない場合は、privateセクションに静的メンバーデータを格納する方が良い解決策です。変数へのアクセスを制限します。グローバル変数は、誰にも制限のないアクセスを与えるので、一般的に悪いです。

あなたのケースでは、グローバル変数i外部リンケージを持っています。他のファイルでは、単にextern int iと宣言してから、iを変更してとすることもできます。

静的メンバデータはあなたの変数がで使用されているという考えのいくつかの並べ替えを与えるので、あなたはそれが内部リンケージを持たせるために、それstaticグローバル変数にする場合であっても、それは、static会員データと比較して良いではありませんクラスのみ、非クラスメンバーではない(同じファイル内にある場合)。したがって、グローバルstaticデータと比較して、staticメンバーデータの可読性が向上します。

+0

ファイルスコープがb.cppで、誰が変更できるのですか? –

+0

@DmitryKachko:他のファイルから、グローバル変数を使用することができます。あなたのケースでは、 '外部 'リンケージがあります。他のファイルでは、 'extern int i'として簡単に宣言してから、変数を使用(および変更*)することができます。 – Nawaz

+0

グローバル変数は名前空間の衝突のために悪いですが、私は名前空間に入れることができます。それは単なる単純な例であり、問​​題の問題ではありません。 –

関連する問題