C 中靜態成員變數的初始化:為什麼在類別之外?
在 C 中,靜態成員變數在類別宣告之外初始化。這種與更直觀的類內初始化的偏差引起了開發人員的好奇心。這項設計決策背後有邏輯原因嗎?
根本原因在於要求靜態成員必須在一個翻譯單元中定義。如果類別內允許初始化,則可能會導致相同變數在不同的翻譯單元中出現多個定義,從而違反了單一定義規則。
為了說明這一點,請考慮以下範例:
struct Gizmo { static string name = "Foo"; };
如果允許使用此程式碼,則將在包含此頭檔的每個翻譯單元中定義名稱。這與單定義規則相衝突,該規則要求一個變數只能有一個定義。
但是,C 提供了一種語法糖,允許在聲明中初始化整數靜態成員:
struct Gizmo { static const int count = 42; };
只要表達式是const 整型或枚舉類型,可以在編譯時求值,且單一翻譯單元中仍存在不違反單一定義規則。例如:
// gizmo.cpp #include "gizmo.h" const int Gizmo::count;
以上是為什麼要在類別宣告之外初始化 C 靜態成員變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!