MFC 架構建立在 C++ 類機制之上。對於從 C 語言轉型的開發者,理解「類」的核心概念——封裝、構造/析構、名域、動態建立——是掌握 MFC 的前提。本文以通俗易懂的「鳥類」為例,層層遞進講解 C++ 類基礎,並介紹工程級編碼規範要點。
類是「資料 + 操作」的封裝體。C 语言的 struct 只有資料,C++ class 加上了成員函數與存取控制 (public/protected/private)。
// C 風格
struct Bird { char head[10]; char wing[10]; ... };
// C++ 風格
class Aves {
public:
Aves(); // 構造函數
~Aves(); // 析構函數
void Fly(); // 成員函數
void Sing();
private:
char m_strHead[10];
char m_strWing[10];
// ...
};
struct 與 class 在 C++ 中幾乎同義,唯一差別:struct 預設 public,class 預設 private。
void 都不能寫)。new 時調用 (堆上)。Aves::Aves() {
strcpy(m_strHead, "Head");
strcpy(m_strWing, "Wing");
// ...
}
~類名(),無參數、無返回值。delete (堆) 時自動調用。Aves::~Aves() {
// 若構造時 new 了記憶體,此處 delete
}
名域最直觀的形式是一對 { }。物件在宣告的名域結束 } 時被銷毀,析構函數隨即執行。
{
// 名域 1
char* str;
{
// 名域 2
Aves bird; // 構造
{
// 名域 3 (巢狀於 2)
str = bird.m_strWing; // 合法
}
} // <<< 此處離開名域 2,bird 析構,記憶體釋放
// str = bird.m_strWing; // 錯誤!bird 已不存在
}
堆上物件: Aves* p = new Aves(); 無名域限制,必須手動 delete p;。delete 後的指標務必置 NULL。
// .h 檔
class Aves {
public:
void Fly(int height); // 聲明
};
// .cpp 檔
void Aves::Fly(int height) { // 定義,雙冒號 :: 表明隸屬
// 實現飛行邏輯
}
public:對外介面 (API)。protected:給衍生類用。private:內部實現細節,外部不可見。良好的封裝:資料 private,提供 public Getter/Setter 控制存取邏輯。
PascalCase、成員變數 m_camelCase、常數 UPPER_SNAKE、巨集 UPPER_SNAKE。void Foo() const) 必加 const。std::unique_ptr/shared_ptr)、容器管理記憶體,拒絕裸 new/delete。Aves() : m_strHead("Head") {}。virtual,確保多態刪除正確調用衍生類析構。explicit。#pragma once 或 #ifndef/define/endif。掌握類機制與規範,MFC 的 CWnd、CDialog、CString 等類別體系將不再神秘,而是觸手可及的工具箱。