在C++中的初始化,static
構件可能無法在類體內初始化包括下列情況:const
整體式的在-類的靜態數據成員
static
成員可以是static
成員constexpr
文本類型必須是
你能解釋爲什麼這些前ceptions?
另外,該式成立:
即使
const static
數據成員被在類體內初始化,即構件通常應在類定義之外定義。
這我從來沒有理解。這個額外定義有什麼意義?
試圖在這裏得到一些直覺。
在C++中的初始化,static
構件可能無法在類體內初始化包括下列情況:const
整體式的在-類的靜態數據成員
static
成員可以是static
成員constexpr
文本類型必須是你能解釋爲什麼這些前ceptions?
另外,該式成立:
即使
const static
數據成員被在類體內初始化,即構件通常應在類定義之外定義。
這我從來沒有理解。這個額外定義有什麼意義?
試圖在這裏得到一些直覺。
爲什麼在類定義中會有一個初始值設定項?
關於兩個例外爲const
和constexpr
靜態數據成員:
[class.static.data]/3
[注意:在這兩種情況中,構件可能會出現在常量表達式。 - 結束注意]
I.e.使用初始化器,你可以在常量表達式中使用它們,例如
struct s
{
static std::size_t const len = 10;
int arr[len];
};
std::size_t const s::len;
如果len
沒有在類定義初始化,編譯器不容易知道其在下一行值來定義的arr
長度。
人們可以認爲關於允許初始化爲在類定義非const
,非constexpr
靜態數據成員的,但是這可能與初始化順序的干擾:
[basic.start.init]/2
顯式專用類模板的定義靜態數據成員已經命令初始化。其他類模板靜態數據成員(即,隱式或顯式實例化的特化)具有無序初始化。 具有靜態存儲持續時間的其他非本地變量已經有序初始化。
也就是說,包括初始值的定義的順序很重要。非局部對象的(動態)初始化順序僅在翻譯單元中定義,這是爲什麼必須有一個定義包括非const
非靜態數據成員的初始化程序的另一個原因。
這個額外的定義是什麼意思?
這已經在IMO的評論中得到了回答。您可能想要添加ODR,即作爲具有外部鏈接的名稱,靜態數據成員必須(僅)被定義在一個翻譯單元中(如果它是ODR使用的話)。程序員可以選擇這個翻譯單元。
關鍵是變量是否會被臭氧使用。只要它不是,你實際上不需要定義它,因爲無論什麼時候引用該變量,它都可以粘貼它的*值*。 – 2013-05-04 11:41:54
這不是一個額外的**定義;這是一個定義。在課堂內部你有一個**聲明**。 – 2013-05-04 12:10:56
由於您可能想要從不同的翻譯單元(= cpp文件)訪問靜態數據成員,因此您必須定義每個翻譯單元引用的「位置」,即定義靜態成員的單個翻譯單元。這與(全局)extern變量是一樣的。 – dyp 2013-05-04 12:17:27