當将類的某個資料成員聲明為static時,該靜态資料成員隻能被定義一次,而且要被同類的所有對象共享。各個對象都擁有類中每一個普通資料成員的副本,但靜态資料成員隻有一個執行個體存在,與定義了多少類對象無關。靜态方法就是與該類相關的,是類的一種行為,而不是與該類的執行個體對象相關。
靜态資料成員不能在類中初始化,也 不可在類體内進行指派,因為它是被所有該類的對象所共享的。 靜态成員可以被初始化,但隻能在類體外進行初始化。 一般形式: 資料類型類名::靜态資料成員名=初值
舉個例子:
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;
}
關于靜态成員函數,可以總結為以下幾點:
1.靜态成員之間可以互相通路,包括靜态成員函數通路靜态資料成員和通路靜态成員函數;
非靜态成員函數可以任意地通路靜态成員函數和靜态資料成員;
靜态成員函數通路非靜态成員函數和非靜态資料成員的方式---靜态函數成員必須通過對象名來通路非靜态資料成員。言下之意,我們可以通過傳入this指針(或一個對象名)的方式通路非靜态成員,又或者在靜态成員函數内new一個對象,通過其調用非靜态成員。
2.由于沒有this指針的額外開銷,是以靜态成員函數與類的全局函數相比速度上會有少許的增長;
3.調用靜态成員函數,可以用成員通路操作符(.)和(->)為一個類的對象或指向類對象的指針調用靜态成員函數,
當同一類的所有對象使用一個量時,對于這個共用的量,可以用靜态資料成員變量,這個變量對于同一類的所有的對象都取相同的值。靜态資料成員的用途之一是統計有多少個對象實際存在。
4.靜态成員仍然遵循public,private,protected通路準則。 5.靜态成員函數沒有this指針,它不能傳回非靜态成員,因為除了對象會調用它外,類本身也可以調用。
靜态函數成員必須通過對象名來通路非靜态資料成員。言下之意,我們可以通過傳入this指針 (或 一個對象名 ) 的方式通路非靜态成員 ,又或者在靜态成員函數内new一個對象,通過其調用非靜态成員。