靜態成員函數可以直接訪問該類的靜態數據和函數成員,而訪問非靜態數據成員必須通過參數傳遞的方式得到一個對象名,然後通過對象名來訪問。
class Myclass
{
private:
public:
};
intMyclass::Sum=0;
Myclass::Myclass(int a,int b,int c)
{
}
void Myclass::GetSum()
{
int main(void)
{
}
由上例可知,非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員。
非靜態成員函數Myclass(inta,int b,int c)和GetSum()都訪問了靜態數據成員Sum。
靜態成員函數不能訪問非靜態成員函數和非靜態數據成員。
我們知道,當調用一個對象的成員函數(非靜態成員函數)時,系統會把該對象的起始地址賦給成員函數的this指針。而靜態成員函數並不屬於某一對象,它與任何對象都無關,因此靜態成員函數沒有this指針。既然它沒有指向某一對象,就無法對一個對象中的非靜態成員進行默認訪問(即在引用數據成員時不指定對象名)。
可以說,靜態成員函數與非靜態成員函數的根本區別是:非靜態成員函數有this指針,而靜態成員函數沒有this指針。由此決定了靜態成員函數不能訪問本類中的非靜態成員。
靜態成員函數可以直接引用本類中的靜態數據成員,因為靜態成員同樣是屬於類的,可以直接引用。在C++程序中,靜態成員函數主要用來訪問靜態數據成員,而不訪問非靜態成員。
關於靜態成員函數,可以總結為以下幾點:
出現在類體外的函數定義不能指定關鍵字static;
靜態成員之間可以相互訪問,包括靜態成員函數訪問靜態數據成員和訪問靜態成員函數;
非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員;
靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;
由於沒有this指針的額外開銷,因此靜態成員函數與類的全局函數相比速度上會有少許的增長;
調用靜態成員函數,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指針調用靜態成員函數,
當同一類的所有對象使用一個量時,對於這個共用的量,可以用靜態數據成員變量,這個變量對於同一類的所有的對象都取相同的值。靜態成員變量只能被靜態成員函數調用。靜態成員函數也是由同一類中的所有對象共用。只能調用靜態成員變量和靜態成員函數。
(總結:靜態成員函數只能訪問靜態數據成員,不能訪問非靜態數據成員;非靜態成員函數能訪問靜態數據成員和非靜態數據成員。(為了某些需求,比如可能某一個變量不屬於具體的對象,而是屬於類,那麼這個成員就是靜態數據成員),在使用時,盡可能使用靜態成員函數訪問靜態數據成員,這樣更加清晰)