一、靜態數據成員
C++允許將類的數據成員定義為靜態成員。靜態數據成員是屬於類的,整個類只有一個備份,相當於類的全局變量,能夠被該類的所有對象共用。
1.靜態成員的聲明
在類數據成員的聲明前加上關鍵字static,就將該成員指定成了靜態數據成員。靜態數據成員遵守public、private、protected訪問權限的限定規則。如:
class Account
{
public:
Account(); //構造函數
~Account(); //析構函數
//.....................
private:
static int number; //靜態數據成員聲明
//.....................
}
2.靜態數據成員的定義
在類的聲明中將數據成員指定為靜態成員,只是一種聲明,並不會為該成員分配內存空間,在使用之前應該對他進行定義。靜態數據成員常常在類外進行定義,與類成員函數的定義方法一樣。定義形式如:
1 //類型 類名::靜態成員名;
2 //類型 類名::靜態成員名 = 初始值
3 int Account::number; //定義靜態成員並初始化為0
注意:(1)在類外定義靜態數據成員時,不能加上static限定詞
(2)在定義靜態數據成員時可以指定他的初始值,若定義是沒有指定初始值,系統將會自動賦上默認值
3.靜態數據成員的訪問
靜態成員屬於整個類,如果將他定義為類的公有成員,在類外可有兩種方式訪問。
a)通過類名訪問
類名::靜態成員名
b)通過對象訪問
對象名.靜態成員名
4.靜態數據成員與非靜態數據成員的區別
(1)非靜態數據成員與對象關聯,每個對象擁有獨立的數據成員備份。靜態數據成員與類關聯,整個類只有一份靜態數據成員備份,由全類所有對象共用。(C++會為對象的非靜態數據成員分配獨立的內存空間,而靜態數據成員在內存中則只分配一次)
(2)非靜態數據成員只有在定義了對象之後才存在(也就是分配內存空間)。靜態數據成員不屬於單個對象,即使沒有定義他所屬類的任何對象時,就已經存在了。
(3)非靜態數據成員的作用域限定在定義對象的塊作用域內,靜態數據成員自他的定義開始到程序結束之前有效。
二、靜態成員函數
在類成員函數的原型前面加上static就將他定義成了靜態成員函數。靜態成員函數屬於整個類,他只能訪問該類的靜態成員(包括靜態數據成員和靜態成員函數),不能訪問非靜態成員(包括非靜態數據成員和非靜態成員函數)。
1.靜態成員函數的聲明定義
class Account
{
public:
Account(); //構造函數
~Account(); //析構函數
//.....................
static int getNumber() //定義靜態成員函數
{
return number; //訪問靜態數據成員
}
private:
static int number; //靜態數據成員聲明
//.....................
}
2.調用方式
靜態成員函數的調用方式有兩種:
a)類調用方式
類名::靜態成員函數名(參數表);
b)對象調用
對象名.靜態成員函數名(參數表);
3.特別注意
(1)和普通成員函數一樣,靜態成員函數也可以在類內或類外定義,還可以定義成內聯函數
(2)靜態函數只能訪問靜態成員(包括靜態數據成員和靜態成員函數),不能訪問非靜態成員(包括非靜態數據成員和非靜態成員函數)
(3)在類外定義靜態成員函數時,不能加上static限定詞
(4)靜態成員函數可以在定義類的任何對象之前被調用,非靜態成員只有在定義對象後,通過對象才能訪問