2016-12-06 83 views
1

好吧,就分配在構造函數/函數聲明爲靜態變量(我不認爲它很重要,其)來定義的編譯時間價值,就好像這些變量只被分配一次,請參閱示例:函數作用域內的靜態聲明和定義不會改變?

#include <iostream> 
#define y 4 
#define z 3 
using namespace std; 

class Foo 
{ 
public: 
    Foo(int x) 
    { 
     static int i = x; 
     cout << i << endl; 
    } 
}; 

int main() 
{ 
    Foo p(y); 
    Foo o(z); 
    return 0; 
} 

預期輸出:

實際輸出:

我無法找到任何搜索,但如果這是一個欺騙只是讓我知道,我會關閉的問題。

回答

2

A static當第一次輸入本地函數時,局部變量僅初始化一次。所以只有第一次初始化發生,所有進一步的被忽略。

這裏是你的程序,修改來說明它。

#include <iostream> 
#define y 4 
#define z 3 
using namespace std; 

struct Bar { 
    int i; 
    Bar(int i) : i{i} 
    { 
     cout << "Bar::Bar with " << i << '\n'; 
    } 
}; 

class Foo 
{ 
public: 
    Foo(int x) 
    { 
     static Bar b = x; 
     cout << b.i << '\n'; 
    } 
}; 

int main() 
{ 
    Foo p(y); 
    Foo o(z); 
    return 0; 
} 

如果你想以後每次調用來修改i,則需要分配進去:

static int i; // default initialize i. 
i = x; // assign a new value into i 
+0

好的,這很有道理,歡呼:) – Geoff

-1

調用​​是與調用i = x;

前者,

static int i = x; 

調用拷貝構造函數,它只能調用一次在i的創作。

後者

i = x; 

分配給它在任何時間的值。如果i是一個類而不是簡單類型,則會調用operator=

+0

爲什麼downvote? –

相關問題