26, 類的靜態成員函式
阿新 • • 發佈:2020-07-25
1、未完成的需求
-
統計在程式執行期間某個類的物件數目 --yes
-
保證程式的安全性(不能使用全域性變數)--yes
-
隨時可以獲取當前物件的數目(Failure)
嘗試解決方案:
1 #include<stdio.h> 2 3 //解決沒有類物件時也能隨時獲取類的物件數目 4 5 class Test 6 { 7 public: 8 static int cCount; //靜態成員變數訪問級別設定為public 9 10 public: 11 Test() 12 { 13 cCount++;14 } 15 ~Test() 16 { 17 cCount--; 18 } 19 20 int getCount() 21 { 22 return cCount; 23 } 24 }; 25 26 int Test::cCount = 0; //靜態成員變數 27 28 29 int main() 30 { 31 32 // printf("count=%d\n", gTest.getCount()); //沒有物件無法列印靜態成員變數儲存的數 33 34 printf("count=%d\n", Test::cCount); //要通過類名訪問cCount靜態成員變數 0 35 36 Test::cCount = 1000; //意外操作 37 printf("count=%d\n", Test::cCount); //安全性不好 1000 ---但是當前沒有任務物件 38 39 return 0; 40 }
結論:我們需要什麼?
-
不依賴物件就可以訪問靜態成員變數
-
必須保證靜態成員變數的安全性-------前面把靜態成員變數訪問級別改為public不安全,太暴力
-
方便快捷的獲取靜態成員變數的值
2.靜態成員函式
(1)靜態成員函式
(2)可以通過類名直接訪問公有靜態成員函式
(3)可以通過物件名訪問公有靜態成員函式
(4)靜態成員函式的定義:直接通過static關鍵字修飾成員函式
例項:
1 #include<stdio.h> 2 3 //解決沒有類物件時也能隨時獲取類的物件數目 解決安全性 4 //不依賴物件就能訪問靜態成員變數,保證靜態成員的安全性,獲取靜態成員變數的值 5 //通過--類名--訪問共有的-----靜態成員函式---普通函式之前加static 6 7 class Demo 8 { 9 private: 10 int i; 11 public: 12 int getI(); 13 static void StaticFunc(const char* s); //靜態成員函式StaticFunc 14 static void StaticSetI(Demo& d, int v ); //靜態成員函式StaticSetI 15 }; 16 17 int Demo::getI() 18 { 19 return i; 20 } 21 22 void Demo::StaticFunc(const char* s) 23 { 24 printf("StaticFunc: %s\n",s); 25 } 26 //第一個引數----返回型別表示返回Demo類物件的引用 27 void Demo::StaticSetI(Demo& d, int v) //靜態成員函式只能通過引數物件Demo&名 d訪問成員變數 28 { 29 d.i = v; //將第二個引數v的值賦值到,第一個引數物件d的成員變數i i=v 30 } 31 32 int main() 33 { 34 Demo::StaticFunc("main Begin..."); //類名------呼叫靜態成員函式StaticFunc 35 36 Demo d; 37 38 d.StaticFunc(d, 10); //物件名d-----呼叫靜態成員函式StaticFunc--------設定i 39 40 Demo::StaticSetI(d, 10); //類名--訪問靜態成員函式StaticSetI 41 42 printf("d.i=%d\n",d.getI()); 43 44 Demo::StaticFunc("main End..."); 45 46 return 0; 47 }
3.靜態成員函式 VS 普通成員函式
最後解決方案:
1 #include<stdio.h> 2 3 //解決沒有類物件時也能隨時獲取類的物件數目 4 5 class Test 6 { 7 private: 8 static int cCount; 9 10 public: 11 Test() 12 { 13 cCount++; 14 } 15 ~Test() 16 { 17 cCount--; 18 } 19 20 static int GetCount() //靜態成員函式 21 { 22 return cCount; 23 } 24 }; 25 26 int Test::cCount = 0; //使用前必須在類外給靜態成員變數分配空間 27 28 29 int main() 30 { 31 printf("count=%d\n", Test::GetCount()); //通過類名獲取當前cCount值 //0 32 33 Test t1; //區域性物件 34 Test t2; 35 36 37 printf("count=%d\n", t1.GetCount()); //通過物件名獲取當前cCount值 2 38 printf("count=%d\n", t2.GetCount()); //2 39 40 41 Test* pt = new Test(); //指標指向Test物件,通過指標訪問 42 printf("count=%d\n", pt->GetCount()); //3 43 delete pt; 44 45 printf("count=%d\n", Test::GetCount()); //2 46 47 return 0; 48 }
4.小結
(1)靜態成員函式是類中特殊的成員函式
(2)靜態成員函式沒有隱藏的this引數
(3)靜態成員函式可以通過類名和物件直接訪問
(4)靜態成員函式只能直接訪問靜態成員變數/函式,不能訪問普通成員變數/函式