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