2012-03-16 171 views
0
  1. 爲什麼編譯器給我一個錯誤,當我不初始化一個值到靜態成員變量?不應該初始化爲0嗎?
  2. 爲什麼我必須在類之外初始化成員變量? (這是非法的,因爲如果你這樣做,並且改變這個靜態成員變量在main函數內部的值,並且你創建了這個clas的一個對象,它將重新分配靜態mamber變量到舊的值),而const靜態成員變量是合法的在類內初始化(這是可能的,因爲你無法改變這個靜態成員變量的值)?

錯誤:未定義參考CLASS_NAME ::一個靜態成員變量初始化C++

+3

你可以發佈一些代碼和編譯器錯誤嗎? – hmjd 2012-03-16 21:28:13

+0

@hmjd:undefined引用class_name :: a – AlexDan 2012-03-16 21:31:43

+1

注意:這是*鏈接器*給你的錯誤,而不是編譯器。這與在頭文件中聲明一個(自由)全局變量爲'extern'相同的效果,但實際上並沒有在.cpp文件中定義它。全局變量必須具有一致的內存位置,所有編譯單元都知道它們,否則它們將不會看到對方對其值的更改。因此,它必須有外部聯繫,並且只能定義一次。它*不像*靜態(編譯單元本地)變量。 – pmdj 2012-03-16 21:33:37

回答

5

從錯誤中發佈,該接頭用,說明該變量尚未定義,並不在於它一直沒有明確初始化

class A 
{ 
    // declaration. 
    static int x; 
}; 

// definition (in this case without explicit initialisation). 
int A::x; 

鏈接器不應發出錯誤和編譯器應該不會發出警告,只要不嘗試使用static變量已分配的前 初始值。

+0

...你做得很好,然後....在最後一個代碼示例中,沒有定義。有一個*聲明*和初始化值,但沒有定義。在很多情況下,這可以很好,因爲靜態積分常量有特殊的規則,但是如果你使用*(odr-),你仍然需要**定義常量。 – 2012-03-16 21:48:42

+0

@DavidRodríguez-dribeas,剛剛刪除,現在。我在聲明中想過,如果一個變量被分配了一個初始值,例如'extern int x = 1;',這使得它成爲一個定義? – hmjd 2012-03-16 21:51:16

+0

呵呵。默認情況下,「A :: x」的值爲「0」,就像任何其他類靜態的'int'變量一樣。 – 2012-03-16 21:53:58

0

靜態成員並不是真的存儲在創建的任何對象中,因爲它是在該類的所有對象之間共享的。

只應創建一次,即使您創建了該類的許多對象。或者即使您創建該類的對象也是。因此你必須單獨做。

編譯器對各種未經初始化的變量(不僅是靜態變量)發出警告。有一個沒有價值的變量通常不是很有用,所以這些警告是好的。添加一個= 0不是太難,是嗎?