天天看點

C++類靜态成員與類靜态成員函數

當将類的某個資料成員聲明為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一個對象,通過其調用非靜态成員。