C++ 中 static 資料成員屬於類別而非物件,所有實例共享唯一拷貝。經典用法如計數器統計物件建立數量:
class Test {
public:
Test() { ++count; }
static int count;
};
int Test::count = 0;
雖然全域變數也能達標,但 static 避免命名空間污染,符合封裝原則。
侯捷《深入淺出 MFC》詳細剖析:動態建立、執行期類型識別、訊息映射、命令路由等核心機制均建構於 static 之上。以訊息映射為例:
#define DECLARE_MESSAGE_MAP() \
static AFX_MSGMAP_ENTRY _messageEntries[]; \
static AFX_MSGMAP messageMap; \
virtual AFX_MSGMAP* GetMessageMap() const;
派生類別使用此宏時,實際宣告了兩個 static 資料成員。即使尚未建立任何物件,這些成員已存在於記憶體中。
BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
此宏在 .cpp 中定義並初始化 CMyWnd::messageMap 與 CMyWnd::_messageEntries。在 AfxWinMain 執行前,MFC 關鍵類別(CWinApp、CWnd 等)的對應靜態成員已就緒,構成訊息傳遞網絡基礎。這佔用部分記憶體,換取極高的訊息分派效率。
static成員不因物件實例化而存在,它本質上是模組級的全域變數,在程式啟動階段即完成建構,為 MFC 運行時機制提供靜態骨架。