首先,我們先通過字面意思來理解...
成員:成員變數、成員函式,
static 修飾成員變數,還有修飾成員函式,
static 宣告為靜態的,稱為靜態成員,不管這個類創建了多少個物件,靜態成員只有一個拷貝,這個拷貝被所有屬于這個類的物件共享,
靜態成員,屬于類 而不是物件,

1.static 修飾成員變數
靜態變數,是在編譯階段就分配空間,物件還沒有創建時,就已經分配空間
靜態成員變數必須在類中宣告,在類外定義,
靜態資料成員不屬于某個物件,在為物件分配空間中不包括靜態成員所占空間,
1 class Data 2 { 3 public: 4 int num;//普通成員變數 5 static int data;//靜態成員變數(類內宣告) 6 }; 7 //定義的時候不需要加static 8 int Data::data=https://www.cnblogs.com/loliconinvincible/p/100;//類外定義+初始化 9 10 void tesk07() 11 { 12 //data是靜態成員變數,是屬于類,可以通過類名稱::直接訪問 13 cout<<Data::data<<endl;//100 14 //賦值 15 Data::data = https://www.cnblogs.com/loliconinvincible/p/200; 16 cout<<Data::data<<endl;//200 17 18 //data靜態變數,是所有物件共享的,可以通過物件名訪問 19 Data ob1; 20 ob1.data = https://www.cnblogs.com/loliconinvincible/p/300; 21 cout<<Data::data<<endl;//300 22 23 Data ob2; 24 cout<<ob2.data<<endl;//300 25 26 //普通成員變數,屬于物件的,只能通過物件名訪問 27 ob1.num = 100; 28 cout<<"ob2.num="<<ob2.num<<endl;//隨機值 29 //cout<<Data::num<<endl;//普通成員變數不能通過類名稱訪問 30 }
2、static修飾靜態成員函式
1 class Data 2 { 3 private: 4 int num;//普通成員變數 5 static int data;//靜態成員變數(類內宣告) 6 public: 7 //普通成員函式,依賴于物件的必須物件呼叫 8 int getData(void) 9 { 10 return data; 11 } 12 }; 13 14 //定義的時候,不需要加static 15 int Data::data = https://www.cnblogs.com/loliconinvincible/p/100;//類外定義+初始化 16 17 void tesk08() 18 { 19 //cout<<Data::data<<endl;//err 靜態data是私有的,類外不能直接訪問 20 //cout<<Data::getData()<<endl;//err getData() 必須物件呼叫 21 22 Data ob; 23 cout<<ob.getData()<<endl; 24 //存在問題:data靜態的,在創建物件之前就已經存在 25 }
存在問題:data靜態的 在創建物件之前 就已經存在
如果類沒有實體化物件 難道 就不能使用data了嗎?
解決上述問題 就要用到靜態成員函式
靜態成員函式:
1 class Data 2 { 3 private: 4 int num;//普通成員變數 5 static int data;//靜態成員變數(類內宣告) 6 public: 7 //普通成員函式,依賴于物件的必須物件呼叫 8 int getData(void) 9 { 10 return data; 11 } 12 13 //靜態成員函式,屬于類,而不屬于物件 14 static int getDataStatic(void) 15 { 16 return data; 17 } 18 }; 19 20 //定義的時候,不需要加static 21 int Data::data = https://www.cnblogs.com/loliconinvincible/p/100;//類外定義+初始化 22 23 void tesk08() 24 { 25 //cout<<Data::data<<endl;//err 靜態data是私有,類外不能直接訪問 26 //cout<<Data::getData()<<endl;//err getData()必須是物件呼叫 27 28 Data ob; 29 cout<<ob.getData()<<endl; 30 31 //1.靜態成員函式,屬于類,就可以通過類名稱直接訪問 32 cout<<Data::getDataStatic()<<endl; 33 34 //2.也可以通過物件名訪問(物件共享靜態成員函式) 35 cout<<ob.getDataStatic()<<endl; 36 }
注意:
1.靜態成員函式的目的,操作靜態成員資料,
2.靜態成員函式,不能訪問非靜態成員資料,

3、普通成員函式 可以操作 靜態成員資料 非靜態成員資料,

4.靜態成員變數和靜態成員函式 都有權限之分
-------------------------------
3.const修飾靜態成員
如果一個類的成員,既要實作共享,又要實作不可改變,那就要用static const修飾
1 class Data 2 { 3 public: 4 const static int data;//靜態成員變數(類內宣告) 5 public: 6 //靜態成員函式 屬于類 而不屬于物件 7 static int getDataStatic(void) 8 { 9 //num = 200;//err 靜態成員函式 不能訪問普通成員變數 10 return data; 11 } 12 }; 13 14 //定義的時候 不需要加static 15 const int Data::data=https://www.cnblogs.com/loliconinvincible/p/100;//類外定義+初始化 16 17 void test02() 18 { 19 //訪問 20 cout<<Data::data<<endl; 21 //賦值 22 //Data::data = https://www.cnblogs.com/loliconinvincible/p/200;//err data靜態成員只讀 23 cout<<Data::data<<endl; 24 }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/54948.html
標籤:C++
上一篇:初始失敗
