2017-06-21 204 views
0

我一段cpp的初學者,無法瞭解以下內容:爲什麼要在結構中初始化const靜態變量?

struct A{ 
int i; 
static int j; 
} 

int A::j = 20; 

在這裏, 我明白了爲什麼靜態varible無法裏面A被初始化並且它必須被初始化使用範圍分辨率A outised。 (這是j的點存儲器將被分配並且值被初始化)並且j在這裏不添加到sizeof(A),因爲它是靜態變量並且具有用於所有對象的靜態存儲。

請看下面的代碼:

struct B{ 
int a; 
const static int b = 20; 
} 

在這裏, 我被迫在結構聲明直接初始化的b值。爲什麼它是這樣的,如果靜態變量是const類型? 如果我試圖在B範圍外定義這個變量,那麼它會拋出一個編譯器錯誤,指出有一個前面的聲明b。這裏當b的內存被實際分配了,爲什麼它必須在聲明中被初始化,爲什麼不能用::這樣的運算符來初始化它,如普通的靜態變量?

+4

您不必在聲明中初始化'b'的值。 'const int B :: b = 20;'會正常工作。我懷疑你在'struct'聲明的末尾忘了添加';'。 –

+2

當你嘗試初始化'B'之外的'b'時會發生什麼?你有編譯器錯誤嗎?什麼是錯誤? –

+0

@FrançoisAndrieux如果靜態變量是'const static'類型的,爲什麼我可以給變量的值與正常的'static'變量不同? – Mbeginner

回答

2

您誤解了錯誤。這個錯誤應該是類似於「你有一個衝突的聲明」,這意味着你聲明瞭內聯const,但是該定義沒有const。所以只需要這樣做:

const int B::b = 20;