2012-08-30 224 views
7

什麼是使用之間的性差異:全局靜態變量vs函數中的靜態變量?

static Foo foo; 
// ... 
foo.func(); 

和:

Foo& GetFoo(void) 
{ 
    static Foo foo; 
    return foo; 
} 

// ... 

GetFoo().func(); 

哪個更好?

+0

使用全局變量可能會導致命名衝突。 – VoidStar

+0

請參閱http://stackoverflow.com/questions/12186857/on-local-and-global-static-variables-in-c。 –

+0

延遲初始化。 – iammilind

回答

10

主要區別在於施工發生時。在第一種情況下,它在main()開始之前的某個時間發生。在第二種情況下,它在第一次致電GetFoo()期間發生。

在第一種情況下,代碼在其初始化之前(非法)使用foo是可能的。在第二種情況下這是不可能的。

+0

雖然意圖是正確的,但在足夠的努力下,您可以在初始化之前使用函數static(在C++ 03中)對函數進行遞歸調用。 –

1

A 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的使用,您必須聲明公共構造函數,這意味着您總是通過它訪問您的類,但是您的類也將能夠獲得副本。