在類別中初始化靜態非常量成員和靜態陣列的困難
在C 中,嘗試直接在類別定義中初始化非常量靜態成員或靜態陣列經常靜態成員或靜態陣列經常靜態成員導致編譯器錯誤。本文探討了這些限制背後的原因,並提出了實現所需功能的解決方法。
為什麼我無法在類別中初始化靜態資料成員?
根據 C 標準,靜態資料成員可以如果它們是 const 整數或枚舉類型,則只能在類別定義中進行初始化。此限制可確保以下內容:
-
唯一定義:類別定義通常包含在頭檔中,頭檔可以合併到多個翻譯單元中。為了防止重複的物件定義,C 要求每個物件都有唯一的定義。需要記憶體儲存的物件的類別內初始化將違反此規則。
為什麼只允許靜態常數整數和枚舉進行類別內初始化?
- 物件儲存:靜態const整數成員被視為編譯時常數,可以由編譯器最佳化。透過允許它們的類別內初始化,編譯器可以消除將它們儲存在記憶體中的需要,從而規避上述限制。
-
可執行性:允許枚舉進行這種類別內初始化,因為它們可以直接使用值來代替整數。
靜態陣列怎麼樣class?
靜態陣列的類別內初始化是被禁止的,原因與靜態非常量成員相同。此外,甚至不允許在類別中初始化靜態常數數組,因為:
-
有限常數:靜態常數數組僅就其元素而言是常數,而不是其大小。這意味著編譯器無法將它們視為編譯時常數並有效地最佳化它們。
解決方法
要初始化類別中的靜態陣列或非常量成員,可以使用以下技術使用:
-
枚舉技巧:使用已定義常數的枚舉數組大小和元素。
-
類別外定義: 在命名空間範圍內的類別定義之外定義靜態變量,允許非常量靜態成員和靜態數組初始化.
C 11 進化
C 11 透過允許初始化非靜態來放寬限制類別聲明中的資料成員以及使用常數表達式初始化靜態const文字成員。然而,這些功能可能尚未在所有編譯器中得到支援。
以上是為什麼C類別中不能直接初始化靜態非常量成員和靜態陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!