1. 程式人生 > 實用技巧 >C++ 類的一個重要成員:靜態成員(一)

C++ 類的一個重要成員:靜態成員(一)

寫在前面

  【目錄】

  一、設計需求

  二、宣告靜態成員

  三、總結

一、設計需求  

  為了實現一個類的一些成員與類本身相關,而不是與類的各個物件保持關聯。這時候類的靜態成員特性就可以派上用場。

二、宣告靜態成員

  在類的成員的宣告之前加上關鍵字static就可以使其與類關聯在一起。成員與其他的類成員一樣,同樣可以是public和private的。對於靜態成員的型別可以是常量、引用、指標、類型別等。

  注意幾點:

  (1)類的靜態成員存在於任何物件之外,物件中不包含任何與靜態資料成員有關的資料。

  (2)對於靜態成員函式,其不與任何物件繫結在一起,即不包含this指標。所以,靜態成員函式不能宣告成const的,也不能在static函式體內使用this指標。

    對於第一點:看以下程式碼:

 1 #include <iostream>
 2 class student
 3 {
 4 public :
 5     student()
 6     {
 7         score  = 100;    
 8         number = 123;
 9     }
10     static int grade;    //因學生年級一樣,宣告成靜態成員
11 private:
12     int score;
13     int number;
14 };
15 int student::grade = 999;
16
17 //main app 18 int main() 19 { 20 student student1; 21 22 std::cout<<"classObject student1 size:"<<sizeof student1<<std::endl; 23 std::cout<<"class student grade:"<<student::grade; 24 }

  程式執行後輸出:

  

  可見student1為 8個位元組,然後將score和number都宣告成靜態的。如下程式碼:

 1 #include <iostream>
 2 class student
 3 {
 4 public :
 5     static int grade;    //因學生年級一樣,宣告成靜態成員
 6 
 7     static int score;
 8     static int number;
 9 };
10 int student::grade = 999;
11 
12 //main app
13 int main()
14 {
15     student student1;
16     
17     std::cout<<"classObject student1 size:"<<sizeof student1<<std::endl;
18     
19     std::cout<<"class student grade:"<<student::grade;
20     std::cout<<"class student score:"<<student::score;
21     std::cout<<"class student number:"<<student::number;
22 }

  見以上程式碼,該程式碼是編譯不通過的。原因由socre和number引起,報錯如下:

  這裡修改以上程式碼,可以把20,21行註釋,即不輸出score和number(相當於不用),或者像第10行程式碼一樣定義它們。出現以上問題的原因是:靜態成員score和number沒有被定義。修改後程式如下:

 1 #include <iostream>
 2 class student
 3 {
 4 public :
 5     static int grade;    
 6     static int score;
 7     static int number;
 8 };
 9 int student::grade = 999;
10 int student::score = 111;
11 int student::number = 222;
12 //main app
13 int main()
14 {
15     student student1;
16     
17     std::cout<<"classObject student1 size:"<<sizeof student1<<std::endl;
18     
19     std::cout<<"class student grade:"<<student::grade<<std::endl;
20     std::cout<<"class student score:"<<student::score<<std::endl;
21     std::cout<<"class student number:"<<student::number<<std::endl;
22 }

  此刻:編譯通過,程式執行結果為:

  注意:這裡student1為 1個位元組。

三、總結:

  類的靜態成員存在於任何物件之外,物件中不包含任何與靜態資料成員有關的資料,通過以上實際程式碼分析,這一知識點更加深入。可見:這對類物件所佔用的空間大小是有影響的。當把類中grade、score、number都宣告成靜態成員時,sizeof該物件,為什麼是1呢,哈哈,這留個問題。(說一下,我用的編譯器環境:MinGW構建套件中的g++)

  本系列關於C++的靜態成員的知識總結,未完待續... 

-------------------------------------------------------------------------------

  知識如何深入到自己大腦中,我想,只有不斷地回想和不斷地實踐。今兒週六,記一筆...