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

C++類的一個重要成員:靜態成員(二)——靜態成員的定義

寫在前面

  【目錄】

  一、一個簡單的程式示例

  二、靜態成員的定義基礎

  三、靜態成員的類內初始化

  四、程式示例的輸出結果

  一、一個簡單的程式示例:

 1 #include <iostream>
 2 
 3 class student
 4 {
 5 public :
 6     const static int grade = 100;    
 7     static int score;
 8     static int number;
 9     static void print_welcome();
10     int  phone;
11 
12
private : 13 int age = 999; 14 15 }; 16 17 int student::score = 111; 18 int student::number = 222; 19 20 void student::print_welcome() 21 { 22 std::cout<<"welcome welcome!!"<<std::endl; 23 std::cout<<"grade:"<<grade<<std::endl; 24 //std::cout<<"age:"<<student::age<<std::endl;
25 std::cout<<"score:"<<score<<std::endl; 26 std::cout<<"score:"<<student::score<<std::endl; 27 28 } 29 30 //main app 31 int main() 32 { 33 student stu; 34 35 std::cout<<"classObject stu size:"<<sizeof stu<<std::endl; 36 37
std::cout<<"class student grade:"<<student::grade<<std::endl; 38 std::cout<<"class student score:"<<student::score<<std::endl; 39 std::cout<<"class student number:"<<student::number<<std::endl; 40 std::cout<<"classObject stu phone:"<<stu.phone<<std::endl; 41 42 student::print_welcome(); 43 }

  一些思考:

  (1)上圖第6行,如果去掉const,這份程式碼能編譯通過嗎?

  (2)對於上圖的第10行程式碼,在程式40行輸出該值,該值是多少呢?

  (3)上圖25、26行程式碼,輸出值一樣嗎?

  (4)上圖如果取消24行的註釋,這份程式碼能編譯通過嗎?

  (5)上圖35行程式碼的輸出值是多少呢?

  二、靜態成員的定義基礎

  (1)對於靜態成員函式:

    和其他成員函式一樣,既可以在類的內部也可以在類的外部定義靜態成員函式。(注意:當在類的外部定義靜態成員時,不能重複static關鍵字,該關鍵字只能出現在類內部的宣告語句中)。

    如何定義靜態成員函式:

1 void student::print_welcome()
2 {
3     std::cout<<"welcome welcome!!";4 }

  (2)對於靜態資料成員:

    因為靜態資料成員不屬於類的任何一個物件,所以它們不是在建立類的物件時被定義。故靜態資料成員不是由建構函式初始化的。(注意:一般來說,不能在類的內部初始化靜態成員,必須在類的外部定義和初始化每個靜態成員,一個靜態資料成員只能被定義一次)。

    靜態資料成員的生命週期:

    與全域性變數類似,靜態資料成員定義在任何函式之外。因此一旦被定義,將一直存在於程式的整個生命週期中。

    如何定義並初始化一個靜態成員:

1 int student::score = 111;

  三、靜態成員的類內初始化

  通常情況下,類的靜態成員不應該在類的內部初始化。但是,可以為靜態成員提供const整數型別的類內初始值,不過需要靜態成員變數必須是字面值常量型別的constexpr。例如如下程式碼:

1 const static int grade = 100;

  四、程式示例輸出結果

  

  關於本文:本文所有知識點來源於《C++Primer第五版》