首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

MFC 中 static 靜態成員的深度應用解析

     編輯:關於VC++

static 基礎特性回顧

C++ 中 static 資料成員屬於類別而非物件,所有實例共享唯一拷貝。經典用法如計數器統計物件建立數量:

class Test {
public:
    Test() { ++count; }
    static int count;
};
int Test::count = 0;

雖然全域變數也能達標,但 static 避免命名空間污染,符合封裝原則。

MFC 核心機制中的 static 關鍵角色

侯捷《深入淺出 MFC》詳細剖析:動態建立、執行期類型識別、訊息映射、命令路由等核心機制均建構於 static 之上。以訊息映射為例:

DECLARE_MESSAGE_MAP 宏展開

#define DECLARE_MESSAGE_MAP() \
    static AFX_MSGMAP_ENTRY _messageEntries[]; \
    static AFX_MSGMAP messageMap; \
    virtual AFX_MSGMAP* GetMessageMap() const;

派生類別使用此宏時,實際宣告了兩個 static 資料成員。即使尚未建立任何物件,這些成員已存在於記憶體中。

BEGIN_MESSAGE_MAP 實作定義

BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd)
    ON_WM_PAINT()
END_MESSAGE_MAP()

此宏在 .cpp 中定義並初始化 CMyWnd::messageMap 與 CMyWnd::_messageEntries。在 AfxWinMain 執行前,MFC 關鍵類別(CWinApp、CWnd 等)的對應靜態成員已就緒,構成訊息傳遞網絡基礎。這佔用部分記憶體,換取極高的訊息分派效率。

核心觀念

static 成員不因物件實例化而存在,它本質上是模組級的全域變數,在程式啟動階段即完成建構,為 MFC 運行時機制提供靜態骨架。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved