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

C++ 類別靜態成員與靜態成員函數完整教學

     編輯:關於C++

靜態成員:類別層級的共享資料

一般成員屬於各物件實例,靜態成員屬於類別本身,所有物件共享同一份記憶體。宣告於類別內,定義於類別外 (全域範圍)。


class Internet {
public:
    Internet(char* n, char* a) { strcpy(name, n); strcpy(addr, a); count++; }
    static void ShowCount() { cout << count << endl; }  // 靜態成員函式
    static int count;  // 宣告
private:
    char name[20], addr[20];
};

int Internet::count = 0;  // 定義並初始化 (不可在類別內初始化)

void main() {
    cout << Internet::count << endl;  // 0
    Internet a("A", "a.com"), b("B", "b.com");
    Internet::ShowCount();  // 2
    Internet c("C", "c.com");
    Internet::ShowCount();  // 3
}

靜態成員函式特性

  • 無 this 指標,無法直接存取非靜態成員。
  • 呼叫方式:類別名::函式名() (推薦) 或 物件.函式名() (不推薦)。
  • 常用於工廠方法、單例模式、狀態追蹤。

應用場景

  1. 物件計數器:建構函式遞增,解構函式遞減。
  2. 狀態旗標:檔案開啟狀態、印表機佔用狀態、單例實例指標。
  3. 鏈表頭尾指標:靜態指標追蹤第一個/最後一個節點。

實戰範例:靜態指標實現學生鏈表


class Student {
public:
    Student(char* n) {
        strcpy(name, n);
        next = head;  // 新節點指向舊頭
        head = this;  // 更新頭指標
    }
    ~Student() {  // 解構時從鏈表移除
        if (head == this) head = next;
        else {
            for (Student* p = head; p; p = p->next)
                if (p->next == this) { p->next = next; break; }
        }
        cout << "解構: " << name << endl;
    }
    static Student* head;  // 靜態頭指標
    char name[30];
    Student* next;
};

Student* Student::head = nullptr;

void main() {
    Student* c = new Student("Marry");
    Student a("Colin"), b("James");
    delete c;  // 觸發解構,從鏈表移除
    for (Student* p = Student::head; p; p = p->next)
        cout << p->name << endl;  // 輸出剩餘節點
}

此例展示靜態成員替代全域變數,封裝於類別內,解構函式自動維護鏈表完整性。

注意事項

  • 靜態成員定義須在單一編譯單元 (通常在 .cpp),避免重複定義連結錯誤。
  • 靜態成員初始化順序跨編譯單元不確定,若相互依賴需謹慎設計 (如 Meyer's Singleton)。
  • 執行緒安全:多執行緒存取靜態資料需加鎖或使用原子操作。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved