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++的靜態成員的知識總結,未完待續...
-------------------------------------------------------------------------------
知識如何深入到自己大腦中,我想,只有不斷地回想和不斷地實踐。今兒週六,記一筆...