一般成員屬於各物件實例,靜態成員屬於類別本身,所有物件共享同一份記憶體。宣告於類別內,定義於類別外 (全域範圍)。
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 指標,無法直接存取非靜態成員。類別名::函式名() (推薦) 或 物件.函式名() (不推薦)。
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; // 輸出剩餘節點
}
此例展示靜態成員替代全域變數,封裝於類別內,解構函式自動維護鏈表完整性。