C++類中的static資料成員和static成員函式
阿新 • • 發佈:2019-01-09
引言
在看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 }
這裡我們注意以下幾點:
- 類中不能對static資料成員初始化,必須在類外定義(static資料成員實際上是類域中的全域性變數)
- static資料成員不是通過類的建構函式初始化。
- 如果類中有多個static資料成員,static資料成員的初始化按照類中定義的順序進行初始化。
- static資料成員被所有類共享,包括派生類的物件