類的成員函數(shù)分為兩種,一種是靜態(tài)函數(shù),另外一種是非靜態(tài)函數(shù)。例如:
class X
{
public:
static void display();
bool getValue();
}
display()為靜態(tài)函數(shù),getValue即為非靜態(tài)函數(shù)。兩種函數(shù)在使用的時(shí)候是不一樣的。靜態(tài)函數(shù)
可以直接由類名來調(diào)用,而非靜態(tài)函數(shù)則必須通過某一個(gè)對(duì)象來調(diào)用,例如:
X::display();
X x;
x.getValue();
為什么會(huì)出現(xiàn)這樣的情況了?這是由于編譯器在處理這兩種函數(shù)的方式不同造成的。靜態(tài)函數(shù)在
運(yùn)行期只有一份拷貝,所有該類生成的對(duì)象共享該函數(shù)以及該函數(shù)的內(nèi)部變量。而對(duì)于非靜態(tài)函數(shù),
不同的對(duì)象擁有自己的內(nèi)部變量。
靜態(tài)成員函數(shù)與普通成員函數(shù)的差別就在于缺少this指針,沒有這個(gè)this指針自然也就無從知道name是哪一個(gè)對(duì)象的成員了。
根據(jù)類靜態(tài)成員的特性我們可以簡(jiǎn)單歸納出幾點(diǎn),靜態(tài)成員的使用范圍:
1.用來保存對(duì)象的個(gè)數(shù)。
2.作為一個(gè)標(biāo)記,標(biāo)記一些動(dòng)作是否發(fā)生,比如:文件的打開狀態(tài),打印機(jī)的使用狀態(tài),等等。
3.存儲(chǔ)鏈表的第一個(gè)或者最后一個(gè)成員的內(nèi)存地址。
為了做一些必要的練習(xí),深入的掌握靜態(tài)對(duì)象的存在的意義,我們以前面的結(jié)構(gòu)體的教程為基礎(chǔ),用類的方式描述一個(gè)線性鏈表,用于存儲(chǔ)若干學(xué)生的姓名,代碼如下:
對(duì)于靜態(tài)成員函數(shù)的一些限制
1.靜態(tài)成員函數(shù)只能引用這個(gè)類的其他靜態(tài)成員(當(dāng)然也可以訪問全局函數(shù)和數(shù)據(jù))。
2.靜態(tài)成員函數(shù)沒有this指針。
3.同一個(gè)函數(shù)不能有靜態(tài)和非靜態(tài)兩種版本,靜態(tài)成員函數(shù)不可以是虛函數(shù)。
4.它們不能被聲明為const或volatile。
靜態(tài)成員函數(shù)也屬于整個(gè)類,所以可以通過使用類名和作用域分辨符被其本身調(diào)用(獨(dú)立于對(duì)象),也可以和對(duì)象聯(lián)系起來調(diào)用。
實(shí)際上,靜態(tài)成員函數(shù)的應(yīng)用是有限的,使用它的好處是在實(shí)際創(chuàng)建任何對(duì)象之前可以“預(yù)初始化”私有的靜態(tài)數(shù)據(jù)。