1. 程式人生 > 實用技巧 >26, 類的靜態成員函式

26, 類的靜態成員函式

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)靜態成員函式只能直接訪問靜態成員變數/函式,不能訪問普通成員變數/函式