1. 程式人生 > >C++類中的static資料成員和static成員函式

C++類中的static資料成員和static成員函式

引言

   在看C++原始碼中,我們經常會看到在類中定義的static資料成員,以及static成員函式。這時我們不禁會想:
  • 為什麼要這樣?(why)
  • 代表什麼含義?(what)
  • 怎樣使用他們?(how)

    ok!接下來我麼就圍繞這三個問題來談談!!

Why

  舉個例子:假如我們定義了一個類Student,在我們使用這個類的時候,我想知道這個類一共被我們例項化了多少次,該怎麼做呢?這時候就用到了static資料成員了。如果我們將static資料成員的訪問許可權設計成private或protected,在非子類中進行類的解析訪問static資料成員是不允許的,所以我們需要引入ststic成員函式。
  其實static成員的好處還有很多,這裡我們就不一一列舉了。

What

 C++Primer裡面講過:static成員不像普通的成員函式,static資料成員獨立於該類的任意物件而存在,每個static資料成員是與類相關,並不與該類的物件相關!!這句話可能乍一聽比較難理解,我們可以這麼理解:static成員是跟類相關,而與類例項化的物件不相關。這是為什麼呢?我們可以從記憶體分配的角度去理解,static資料成員是在程式的靜態儲存區分配記憶體的,而類中的非靜態資料成員則是在棧空間上分配。
 我們再來看static成員函式,上面說過static資料成員獨立於該類的任意物件而存在,因此,static成員函式沒有this指標。而對於一般的成員函式,具有一個附加的隱含引數,即指向該類物件的一個this指標。因為static成員函式不含this指標,所以它就不能呼叫類的非靜態資料成員,但它可以直接訪問static資料成員。

How

 接下來我們來討論如何使用的問題:
 既然是static資料成員,所以關鍵字static是必不可少的,例如:
static.h檔案
 2 #include  <iostream>
 3 #include  <string>
 4 using namespace std;
 5 class Person
 6 {
 7 private:
 8     string name;
 9     static int age;
10 public:
11     Person(const string&nm):name(nm)
12     {}
13     void
Print() 14 { 15 cout<<name<<" is "<<age<<endl; 16 } 17 }; 18 int Person::age=20;
static.cpp檔案
21 
22 #include "stdafx.h"
23 #include "static.h"
24 #include <iostream>
25 using namespace std;
26 
27 int _tmain(int argc, _TCHAR* argv[])
28 {    
29     Person person("tom");
30     person.Print();
31     cout<<endl;
32     return 0;
33 }

這裡我們注意以下幾點:

  1. 類中不能對static資料成員初始化,必須在類外定義(static資料成員實際上是類域中的全域性變數)
  2. static資料成員不是通過類的建構函式初始化。
  3. 如果類中有多個static資料成員,static資料成員的初始化按照類中定義的順序進行初始化。
  4. static資料成員被所有類共享,包括派生類的物件