2010-08-01 247 views
0

我有以下代碼:C++靜態成員

void Foo() { 

    static std::vector<int>(3); 

    // Vector object is constructed every function call 

    // The destructor of the static vector is invoked at 
    // this point (the debugger shows so) 
    // <------------------- 

    int a; 
} 

然後地方我打電話Foo幾次爲什麼矢量對象被每個Foo()調用構造序列

爲什麼是析構函數在static ...聲明後調用?


更新:

我想實現的功能,一旦調用機制,我覺得寫東西像

static core::CallOnce(parameters)其中CallOnce是一個類的名字將是非常好的。

在我看來,寫作static core::CallOnce call_once(parameters)看起來更糟糕,但沒關係,這是我無法做任何事情的情況。

謝謝。

回答

12

你的變量需要一個名字:

static std::vector<int> my_static_vector(3); 
+4

爲什麼這會立即得到downvoted? – 2010-08-01 04:01:36

+0

@邁克爾:好問題。必須找到誰保持downvoting而不留下一個怪異的評論!這是他們的目的! (哦,+1) – 2010-08-01 04:03:00

+0

@詹姆斯你知道的機會,爲什麼會發生這種情況?爲什麼不能在構造函數中做一些工作的未命名對象是一個「正常的」靜態變量,並且不會被構造 - 破壞? – 2010-08-01 04:07:44

7

你忘了給該載體的名字,所以沒有任何變量指向它它的創建

+0

+1也*表示正確的答案。 – 2010-08-01 04:03:45

4

因爲std::vector<int>(3)創建一個無名的臨時後它立即銷燬,它只存在於其包含的表達式的末尾。調試器不能像構造那樣在同一行顯示破壞,所以它顯示在下一行。

給該項目一個名字,並且將會應用正常的static語義。

+0

哈哈 - 不是每個人都馬上堆起來! – 2010-08-01 04:01:47