性質(zhì)
- 類的靜態(tài)成員(static)存在于任何對象之外菜拓,對象中不包含任何與靜態(tài)數(shù)據(jù)成員有關(guān)的數(shù)據(jù)蹬跃。
- 靜態(tài)成員函數(shù)也不與任何對象綁定在一起辅鲸,它們不包括this指針靶壮,作為結(jié)果建车,靜態(tài)成員函數(shù)不能聲明成const的,而且我們也不能在static函數(shù)體內(nèi)使用this指針襟铭。
聲明
通過在成員的聲明前加上關(guān)鍵字static使得其與類聯(lián)系在一起,可以是public锣笨,也可以是private的蝌矛,可以是常量、引用错英、指針入撒、類類型等。
定義
既可以在類的內(nèi)部也可以在類的外部進(jìn)行定義椭岩。
- 外部定義時茅逮,不能重復(fù)static關(guān)鍵字,static只出現(xiàn)在類的內(nèi)部聲明語句中判哥。
ps:
因為靜態(tài)數(shù)據(jù)成員不屬于類的任何一個對象献雅,所以它們并不是在創(chuàng)建類的對象時被定義的,這意味著它們不是由類的構(gòu)造函數(shù)初始化的塌计。 - 一般來說挺身,我們不能在類的內(nèi)部初始化靜態(tài)成員,必須在類的外部定義和初始化每個靜態(tài)成員锌仅。
- 要想確保對象只定義一次最好的辦法是把靜態(tài)數(shù)據(jù)成員的定義和其他非內(nèi)聯(lián)函數(shù)的定義放在同一個文件中章钾。
使用
- 使用作用域運算符直接訪問靜態(tài)成員:
double r;
r = Account::rate(); //rate為Account類里面的靜態(tài)成員
- 仍然可以使用類的對象、引用或者指針來訪問靜態(tài)成員:
Account ac1;
Account *ac2 = &ac1;
//以下兩種調(diào)用靜態(tài)成員函數(shù)rate的方式等價
r = ac1.rate(); //通過Account的對象或引用調(diào)用
r = ac2 -> rate(); //通過指向Account對象的指針調(diào)用
- ps: 成員函數(shù)不用通過作用域運算符就能直接使用靜態(tài)成員
使用場景
- 靜態(tài)數(shù)據(jù)成員的類型可以就是它所屬的類類型
class Bar {
public:
//...
private:
static Bar mem1; //正確
Bar *mem2; //正確
Bar mem3; //錯誤
};
非靜態(tài)數(shù)據(jù)成員受到限制热芹,只能聲明成它所屬類的指針和引用贱傀。
- 靜態(tài)成員可以被用作默認(rèn)實參
class Screen{
public:
//bkground表示一個在類中稍后定義的靜態(tài)成員
Screen& clear (char = bkground);
private:
static const char bkground;
};
非靜態(tài)數(shù)據(jù)成員不能作為默認(rèn)實參,因為它本身的值屬于對象的一部分伊脓,這么做的結(jié)果是無法真正提供一個對象以便從中獲取成員的值府寒,最終將引發(fā)錯誤。