1,成員變量的回顧:
1,通過對象名能夠訪問 public 成員變量;
2,每個對象的成員變量都是專屬的;
3,成員變量不能在對象之間共享;
1,在做程序設計中,成員變量一般是私有的、至少不是公有的;
2,新的需求:
1,統計在程序運行期間某個類的對象數目;
2,保證程序的安全性(不能使用全局變量);
3,隨時可以獲取當前對象的數目;
3,解決方案的嘗試編程實驗:
1 #include <stdio.h> 2 3 int gCount = 0; 4 5 class Test 6 { 7 private: 8 int mCount; 9 10 public: 11 Test() : mCount(0) 12 { 13 // mCount++; 14 gCount++; 15 } 16 17 ~Test() 18 { 19 // --mCount; 20 gCount--; 21 } 22 23 int getCount() 24 { 25 // return mCount; 26 return gCount; // 類的成員函數中可以調用全局變量,全局變量在類的任何地方都可以訪問和改變它; 27 } 28 }; 29 30 Test gTest; 31 32 int main() 33 { 34 Test t1; 35 Test t2; 36 37 /* 38 printf("count = %d\n", gTest.getCount()); // 打印 1,成員變量每個類各有一個,先被初始化為 0,后加加; 39 printf("count = %d\n", t1.getCount()); // 打印 1 ,成員變量、每個類各有一個,先被初始化為 0,后加加; 40 printf("count = %d\n", t2.getCount()); // 打印 1,成員變量、每個類各有一個,先被初始化為 0,后加加; 41 */ 42 43 printf("count = %d\n", gTest.getCount()); // 打印 3; 44 printf("count = %d\n", t1.getCount()); // 打印 3; 45 printf("count = %d\n", t2.getCount()); // 打印 3; 46 47 return 0; 48 }
1,不可以使用全局變量,全局變量在當代軟件開發中是不受歡迎的,因為它不 夠安全,任意地方都可以訪問和修改,舍棄;
4,靜態成員變量:
1,在 C++ 中可以定義靜態成員變量:
1,靜態成員變量屬於整個類所有;
1,不是隸屬於某個對象所有;
2,靜態成員變量的生命期不依賴於任何對象;
1,其生命期如同全局變量一樣,靜態成員變量的生命期是程序的運行周期;
3,可以通過類名直接訪問共有靜態成員變量;
1,靜態成員變量也有訪問等級;
4,所有對象共享類的靜態成員變量;
5,可以通過對象名訪問公有靜態成員變量;
5,靜態成員變量的特性:
1,在定義時直接通過 static 關鍵字修飾;
2,靜態成員變量需要在類外單獨分配空間;
1,其隸屬於整個類,不可能占用對象的空間;
2,只能在類的外部單度分配空間;
3,靜態成員變量在程序內部位於全局數據區;
1,全局數據區保存已初始化的全局變量或靜態局部變量;
2,靜態成員變量和全局變量、靜態局部變量是一致的,存儲在同一個地方,但是只有在類的外部重新定義靜態成員變量才可以存儲到靜態存儲區;
3,靜態存儲變量一般的會初始化,所以其存儲在全局數據區;
4,語法規則:
1,Type ClassName::VarName = value;
2,是在類的外部直接定義出來;
6,靜態成員變量的使用編程實驗:
1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 static int cCount; // 得到靜態成員變量;這里編譯器顯示沒有辦法訪問到 Test::cCount,也就是說鏈接器鏈接的時候找不到 Test::cCount 的存儲空間;靜態成員變量不隸屬於任何的對象,因此要單獨定義它,使得編譯器知道這個靜態成員變量需要在全局數據區分配空間;見下面注釋; 7 8 public: 9 Test() 10 { 11 cCount++; 12 } 13 14 ~Test() 15 { 16 --cCount; 17 } 18 19 int getCount() 20 { 21 return cCount; 22 } 23 }; 24 25 int Test::cCount = 0; // 需要在類的外部單獨定義,以便為它分配空間;要用作用域分辨符告訴編譯器 cCount 隸屬於 Test 這個類; 26 27 Test gTest; 28 29 int main() 30 { 31 Test t1; 32 Test t2; 33 34 printf("count = %d\n", gTest.getCount()); // 3 35 printf("count = %d\n", t1.getCount()); // 3 36 printf("count = %d\n", t2.getCount()); // 3 37 38 Test* pt = new Test(); 39 40 printf("count = %d\n", pt->getCount()); // 4 41 42 delete pt; 43 44 printf("count = %d\n", gTest.getCount()); // 3 45 46 return 0; 47 }
7,小結:
1,類中可以通過 static 關鍵字定義靜態成員變量;
2,靜態成員變量隸屬於類所有;
3,每一個對象都可以訪問靜態成員變量;
4,靜態成員變量在全局數據區分配空間;
1,靜態成員變量不像靜態局部變量一樣可以直接保存到靜態存儲區,所以還要在類外部定義靜態存儲變量,以便能夠給其分配到靜態存儲區里面;
5,靜態成員變量的生命周期為程序運行期;