c++ 類static成員

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

 

    當將類的某個數據成員聲明爲static時,該靜態數據成員只能被定義一次,並且要被同類的全部對象共享。各個對象都擁有類中每個普通數據成員的副本,但靜態數據成員只有一個實例存在,與定義了多少類對象無關。靜態方法就是與該類相關的,是類的一種行爲,而不是與該類的實例對象相關。ios

    靜態數據成員的用途之一是統計有多少個對象實際存在。函數

    靜態數據成員不能在類中初始化,實際上類定義只是在描述對象的藍圖,在其中指定初值是不容許的。也不能在類的構造函數中初始化該成員,由於靜態數據成員爲類的各個對象共享,不然每次建立一個類的對象則靜態數據成員都要被從新初始化。this

    靜態成員不可在類體內進行賦值,由於它是被全部該類的對象所共享的。你在一個對象裏給它賦值,其餘對象裏的該成員也會發生變化。爲了不混亂,因此不可在類體內進行賦值。spa

    靜態成員的值對全部的對象是同樣的。靜態成員能夠被初始化,但只能在類體外進行初始化。指針

    通常形式:對象

    數據類型類名::靜態數據成員名=初值io

    注意:不能用參數初始化表對靜態成員初始化。通常系統缺省初始爲0。class

 

    靜態成員是類全部的對象的共享的成員,而不是某個對象的成員。它在對象中不佔用存儲空間,這個屬性爲整個類所共有,不屬於任何一個具體對象。因此靜態成員不能在類的內部初始化,好比聲明一個學生類,其中一個成員爲學生總數,則這個變量就應當聲明爲靜態變量,應該根據實際需求來設置成員變量。test

 

#include "iostream"stream

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;   // 這行代碼是錯誤的

    靜態函數成員必須經過對象名來訪問非靜態數據成員。

    另外,靜態成員函數在類外實現時候無須加static關鍵字,不然是錯誤的。

    若在類的體外來實現上述的那個靜態成員函數,不能加static關鍵字,這樣寫就能夠了:

     int test::Getnum()

     {

       .........

     }

一、static成員的全部者是類自己和對象,可是多有對象擁有同樣的靜態成員。從而在定義對象是不能經過構造函數對其進行初始化。

二、靜態成員不能在類定義裏邊初始化,只能在class body外初始化。

三、靜態成員仍然遵循public,private,protected訪問準則。

四、靜態成員函數沒有this指針,它不能返回非靜態成員,由於除了對象會調用它外,類自己也能夠調用。

 

靜態成員函數能夠直接訪問該類的靜態數據和函數成員,而訪問非靜態數據成員必須經過參數傳遞的方式獲得一個對象名,而後經過對象名來訪問。


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指針的額外開銷,所以靜態成員函數與類的全局函數相比速度上會有少量的增加; 調用靜態成員函數,能夠用成員訪問操做符(.)和(->)爲一個類的對象或指向類對象的指針調用靜態成員函數, 當同一類的全部對象使用一個量時,對於這個共用的量,能夠用靜態數據成員變量,這個變量對於同一類的全部的對象都取相同的值。靜態成員變量只能被靜態成員函數調用。靜態成員函數也是由同一類中的全部對象共用。只能調用靜態成員變量和靜態成員函數。

相關文章
相關標籤/搜索