當將類的某個數據成員聲明為static時,該靜態數據成員只能被定義一次,而且要被同類的所有對象共享。各個對象都擁有類中每一個普通數據成員的副本,但靜態數據成員只有一個實例存在,與定義了多少類對象無關。靜態方法就是與該類相關的,是類的一種行為,而不是與該類的實例對象相關。
#include "iostream"
using namespace std; class test { private: int x; int y; public: static int num; static int Getnum() { x+=5; // 這行代碼是錯誤的,靜態成員函數不能調用非靜態數據成員,要通過類的對象來調用。
num+=15; return num; } }; int test::num = 10; int main(void) { test a; cout<<test::num<<endl; //10
test::num = 20; cout<<test::num<<endl; //20
cout<<test::Getnum()<<endl; //35
cout<<a.Getnum()<<endl; //50
system("pause"); return 0; }
通過上例可知: x+=5; // 這行代碼是錯誤的
靜態成員函數可以直接訪問該類的靜態數據和函數成員,而訪問非靜態數據成員必須通過參數傳遞的方式得到一個對象名,然后通過對象名來訪問。
class Myclass { private: int a,b,c; static int Sum; //聲明靜態數據成員
public: Myclass(int a,int b,int c); void GetSum(); }; int Myclass::Sum=0; //定義並初始化靜態數據成員
Myclass::Myclass(int a,int b,int c) { this->a=a; this->b=b; this->c=c; Sum+=a+b+c; } void Myclass::GetSum() { cout <<"Sum=" <<Sum <<endl; } int main(void) { Myclass me(10,20,30); me.GetSum(); system("pause"); return 0; }
由上例可知,非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員。
非靜態成員函數Myclass(int a,int b,int c)和GetSum()都訪問了靜態數據成員Sum。
靜態成員函數不能訪問非靜態成員函數和非靜態數據成員。
關於靜態成員函數,可以總結為以下幾點:
出現在類體外的函數定義不能指定關鍵字static;
靜態成員之間可以相互訪問,包括靜態成員函數訪問靜態數據成員和訪問靜態成員函數;
非靜態成員函數可以任意地訪問靜態成員函數和靜態數據成員;
靜態成員函數不能訪問非靜態成員函數和非靜態數據成員;
由於沒有this指針的額外開銷,因此靜態成員函數與類的全局函數相比速度上會有少許的增長;
調用靜態成員函數,可以用成員訪問操作符(.)和(->)為一個類的對象或指向類對象的指針調用靜態成員函數,
當同一類的所有對象使用一個量時,對於這個共用的量,可以用靜態數據成員變量,這個變量對於同一類的所有的對象都取相同的值。靜態成員變量只能被靜態成員函數調用。靜態成員函數也是由同一類中的所有對象共用。只能調用靜態成員變量和靜態成員函數。
