首先,我們先通過字面意思來理解... 成員:成員變數、成員函數。 static 修飾成員變數,還有修飾成員函數。 static 聲明為靜態的,稱為靜態成員。不管這個類創建了多少個對象,靜態成員只有一個拷貝,這個拷貝被所有屬於這個類的對象共用。 靜態成員,屬於類 而不是對象。 1.static 修飾成 ...
首先,我們先通過字面意思來理解...
成員:成員變數、成員函數。
static 修飾成員變數,還有修飾成員函數。
static 聲明為靜態的,稱為靜態成員。不管這個類創建了多少個對象,靜態成員只有一個拷貝,這個拷貝被所有屬於這個類的對象共用。
靜態成員,屬於類 而不是對象。
1.static 修飾成員變數
靜態變數,是在編譯階段就分配空間,對象還沒有創建時,就已經分配空間
靜態成員變數必須在類中聲明,在類外定義。
靜態數據成員不屬於某個對象,在為對象分配空間中不包括靜態成員所占空間。
1 class Data 2 { 3 public: 4 int num;//普通成員變數 5 static int data;//靜態成員變數(類內聲明) 6 }; 7 //定義的時候不需要加static 8 int Data::data=100;//類外定義+初始化 9 10 void tesk07() 11 { 12 //data是靜態成員變數,是屬於類,可以通過類名稱::直接訪問 13 cout<<Data::data<<endl;//100 14 //賦值 15 Data::data = 200; 16 cout<<Data::data<<endl;//200 17 18 //data靜態變數,是所有對象共用的,可以通過對象名訪問 19 Data ob1; 20 ob1.data = 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 = 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 = 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=100;//類外定義+初始化 16 17 void test02() 18 { 19 //訪問 20 cout<<Data::data<<endl; 21 //賦值 22 //Data::data = 200;//err data靜態成員只讀 23 cout<<Data::data<<endl; 24 }