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

MFC 類基礎與 C++ 程式編寫規範入門:從 C 到 C++ 的關鍵躍遷

     編輯:VC 教學

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 控制存取邏輯。

七、 C++ 編程規範要點 (工程實踐)

  1. 命名慣例: 類 PascalCase、成員變數 m_camelCase、常數 UPPER_SNAKE、巨集 UPPER_SNAKE。
  2. const 正確性: 唯讀參數、唯讀成員函數 (void Foo() const) 必加 const。
  3. RAII (資源獲取即初始化): 智慧指標 (std::unique_ptr/shared_ptr)、容器管理記憶體,拒絕裸 new/delete。
  4. 初始化列表: 構造函數優先用初始化列表 Aves() : m_strHead("Head") {}。
  5. 虛析構: 基類析構函數必須 virtual,確保多態刪除正確調用衍生類析構。
  6. 禁止隱式轉換: 單參數構造函數加 explicit。
  7. 頭檔防衛: #pragma once 或 #ifndef/define/endif。

掌握類機制與規範,MFC 的 CWnd、CDialog、CString 等類別體系將不再神秘,而是觸手可及的工具箱。

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