2013-07-20 54 views
-1

不可否認,之所以這樣做的原因已經消退,因爲C++ 11已經擺脫了那個令人討厭的規則 - 我認爲它聲明瞭靜態const int/char/enum被允許你在標題中進行初始化,但對於所有其他類型你不能。正因爲如此,我想嘗試總結C++的聲明和定義約定。聲明與定義的C++存儲類和限定符規則

會有人能夠採取我嘗試/做下面的事情,並擴大它爲我想念/得到不正確的。我想總結各種static/const/int/non-int變量的聲明和定義的所有「規則」。理想情況下,這可能放在到的某些種類表3列:/數據的類型聲明/ defining-但我不知道該怎麼做就在這裏:

靜態數據成員(聲明)

  • 只提供類型和名稱,不要初始化,因爲使用相同標題的多個文件最終會生成多個副本。

靜態數據成員(定義)

  • 初始化的源文件中的變量。不必在源文件定義中重複「靜態」一詞。

const的數據成員(聲明)

  • 宣告但使用關鍵字常量在頭文件未初始化。

const的數據成員(定義)

  • 必須使用在構造函數初始化值列表進行初始化。

靜態和const數據成員(聲明)

  • 使用關鍵字靜態和const但未初始化在頭文件中聲明。

靜態和const數據成員(定義)

  • 在源文件中定義。不需要使用關鍵字static和const(??)。

NB:我明白預C++ 11 INT /枚舉/曾經有過關於靜態的特殊規則(或者是它的靜態常量?)字符,這是他們可以可以在頭初始化? ?

  • 規則全局變量
  • 規則易變
  • 規則的extern
  • 波動是否遵循完全相同的規則「常量」?靜態易失性會遵循靜態數據成員等的約定嗎?
+1

我想你還沒有聽說過C++ 11允許非靜態數據成員在課堂上進行初始化初始化 – Casey

+0

你需要檢查你的源代碼另外,我不是100%確定你理解* declare *和* define *的真正含義 –

回答

0

在C++標準中,constvolatile幾乎總是「彼此相鄰」。特別是,volatileconst具有相同的優先順序和「需要位置」。您可以初始化簡單類型的const static(即,例如int或緊密相關的類型,但不包括其他類型(具有構造函數的那些類型,例如int或其他類型)例如)

+0

爲靜態const成員提供值的規則有點複雜,* constructor *的存在不是標準,而是靜態const成員是*整數*或*枚舉*類型(甚至不是'const char *') –

+0

@DavidRodríguez-dribeas:好的,編輯過。 –