2012-08-30 21 views
7

使用との間diferenceは何ですか?グローバルな静的変数と関数の静的変数</p> <pre><code>static Foo foo; // ... foo.func(); </code></pre> <p>そして:優れている</p> <pre><code>Foo& GetFoo(void) { static Foo foo; return foo; } // ... GetFoo().func(); </code></pre> <p>

+0

グローバル変数を使用すると、命名の競合が発生する危険性があります。 – VoidStar

+0

http://stackoverflow.com/questions/12186857/on-local-and-global-static-variables-in-cを参照してください。 –

+0

遅延初期設定。 – iammilind

答えて

10

主な違いは、構築が行われるときです。最初のケースでは、main()が始まる前にいつか発生します。 2番目のケースでは、それはGetFoo()への最初の呼び出しの間に発生します。

最初のケースでは、コードが(不正に)初期化の前にfooを使用する可能性があります。 2番目のケースではこれは不可能です。

+0

インテントが正しい間に、十分な努力を払って、関数の再帰呼び出しを通じて初期化の前にスタティック関数(C++ 03で)を使用することができます。 –

1

GetFooは、通常、クラス/オブジェクトのコピーを必要としないときに使用されます。たとえば :

class Foo 
{ 
private: 
    Foo(){}; 
    ~Foo(); 
public: 
    static Foo* GetFoo(void) 
    { 
     static Foo foo; 
     return &foo; 
    } 

    int singleobject; 
}; 

あなたはFoo::GetFoo()->sinlgeobject経由singleobjectに外部からアクセスすることができます。プライベートコンストラクタとデストラクタは、あなたのクラスが作成されたコピーを取得することを避けます。

static Foo fooを使用するには、公開コンストラクタが宣言されている必要があります。つまり、常にクラスにアクセスしていますが、クラスもコピーを取得できます。

関連する問題