給定類定義包含靜態成員 static int i,在構造函數中 i++,析構函數中 i--,靜態方法 getVal() 返回 i。主函數執行流程:
Obj obj1; // 1. 構造:i=1
f(); // 2. 調用 f()
Obj obj2; // 2.1 構造:i=2
cout << obj2.getVal(); // 輸出 2
// f() 結束,obj2 離開作用域
// 2.2 析構:i=1
Obj *obj3 = new Obj; // 3. 構造:i=2
cout << obj3->getVal(); // 輸出 2
delete obj3; // 4. 析構:i=1
cout << Obj::getVal(); // 輸出 1
對應三次輸出:obj2.getVal()→2,obj3->getVal()→2,Obj::getVal()→1。
int Obj::i = 0;(頭文件聲明,cpp 定義)。Obj::i 或 obj.i(不推薦後者)。obj1、obj2)。new 時構造,delete 時析構(如 obj3)。靜態成員 i 不隨對象創建銷毀而分配釋放,只隨類加載/卸載。對象構造析構只是修改靜態成員的值,而非創建它。
全局/靜態存儲區: 堆區: 棧區:
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Obj::i (int) │ │ obj3 (Obj*) │ │ obj1 (Obj) │
│ 初始 0 │ │ → Obj 實例 │ │ obj2 (Obj) │
│ 變化: 0→1→2→1→2→1│ │ │ │ main 參數等 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
std::atomic 或鎖保護。C++ 靜態數據成員是類級別共享變量,生命周期獨立於對象。構造函數中 i++、析構中 i-- 實現了對象計數器功能。理解靜態存儲區、棧、堆三大內存區域的分配釋放時機,是掌握 C++ 對象模型的關鍵。本題通過精確追蹤 i 的變化序列(0→1→2→1→2→1),驗證了構造/析構調用順序與靜態成員共享特性。