什麼是使用之間的性差異:全局靜態變量vs函數中的靜態變量?
static Foo foo;
// ...
foo.func();
和:
Foo& GetFoo(void)
{
static Foo foo;
return foo;
}
// ...
GetFoo().func();
哪個更好?
什麼是使用之間的性差異:全局靜態變量vs函數中的靜態變量?
static Foo foo;
// ...
foo.func();
和:
Foo& GetFoo(void)
{
static Foo foo;
return foo;
}
// ...
GetFoo().func();
哪個更好?
主要區別在於施工發生時。在第一種情況下,它在main()
開始之前的某個時間發生。在第二種情況下,它在第一次致電GetFoo()
期間發生。
在第一種情況下,代碼在其初始化之前(非法)使用foo
是可能的。在第二種情況下這是不可能的。
雖然意圖是正確的,但在足夠的努力下,您可以在初始化之前使用函數static(在C++ 03中)對函數進行遞歸調用。 –
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
的使用,您必須聲明公共構造函數,這意味着您總是通過它訪問您的類,但是您的類也將能夠獲得副本。
使用全局變量可能會導致命名衝突。 – VoidStar
請參閱http://stackoverflow.com/questions/12186857/on-local-and-global-static-variables-in-c。 –
延遲初始化。 – iammilind