類中的靜態成員(static)

(一)靜態數據成員 函數

      靜態數據成員是類的全部對象共享的成員,而不是某個對象的成員。 this

      使用靜態數據成員能夠節省內存,靜態數據成員只存儲一處,供全部對象使用。靜態數據成員至關於類中的「全局變量」(一個對象改變了它的值,例如改變的值爲a,那麼其餘對象看到它的值爲都爲a)。 spa

 使用靜態成員的方法和注意事項: 指針

一、 靜態數據成員在定義或說明是前面加上關鍵字「static 對象

eg: private: 內存

          int  a; get

          static int staticVariable;//定義了一個靜態變量 class

二、靜態成員的初始化 變量

(1)初始化在類體外進行,前面不加static,以避免與通常靜態變量或對象相混淆。 權限

(2)初始化時使用做用於運算符::來標明他所屬的類(這也說明了靜態數據成員是屬於類的,而不是屬於某個對象的。)

eg:    class A {

         private:

              int a ;

         public:

               static int staticVariable;

        };

        int A::staticVariable = 0; //在類外進行初始化,並加上做用於運算符(::)

注意:靜態數據成員存放在靜態存儲區,必須對它進行初始化。

三、引用靜態成員的格式

       若是靜態成員的訪問權限是public,則能夠用

        <類名> ::<靜態成員名>的格式來訪問

       eg:A ::staticVariable = 10;

 舉一個例子:

class Number{

    private:

          int a,b;

          static int staticVarible;

    public:

           void getVariable(){

                 cout << a << "," << b <<"," << staticVarible << endl;

             }  

           void getStaticVarible(){

                  cout << staticVarible << endl;

             }

           Number (int a , int b , int c){

                  this->a = a;//當參數的名字與類中變量名相同時,用this指針加以區分

                  this->b = b;

                  this->staticVarible = c;

            }

 };

 int Number :: staticVarible = 3;// 類外初始化靜態數據成員


void main(){

 

    Number M(3,7,1);

    M.getVariable();

   

    Number N(10,8,11);

    N.getVariable();

   

    M.getStaticVarible();

    N.getStaticVarible(); 

}

輸出結果:

3,7,1

10,8,11

11

11

 結果代表了在初始化了N之後,M中的StaticVarible的值變成了11,說明了靜態數據成員是多個對象共享的。


(二)靜態成員函數:

      靜態成員函數與靜態成員同樣,都屬於類,而不屬於某個對象。所以,對靜態成員的引用能夠用類名

 注意:靜態成員函數的實現中能夠直接引用類中說明的靜態成員,不能夠直接引用類中說明的非靜態成員(爲何不能引用呢?由於非靜態成員只能經過對象來調用,而不能經過類來調用,意味着在沒有對象存在時,非靜態成員是不分配內存的,若是靜態成員函數用了非靜態成員那麼將產生錯誤)。靜態成員函數若是要引用非靜態成員時,能夠經過對象來訪問。

舉一個例子:

class Number{ 

private:

    int a,b;

    static int staticVarible;  

public:

       Number (int a , int b , int c){ 

        this->a = a;

        this->b = b;

        this->staticVarible = c;   

    }

    int getStaticVarible(){   

        return staticVarible;

    }

   

    //靜態成員函數能夠在類內定義也能夠在類外定義

    static void printStaticVarible(){

        cout << staticVarible; 

    };

    static void printVaribles(Number f);

 };

 

int Number :: staticVarible = 3;


void Number::printVaribles(Number f){

/*----這裏用 f 能夠調用類中的私有成員,是由於 printVaribles(Number f) 是類函數的緣故----*/

    f.printA();//只能用對象來訪問非靜態成員函數

    cout << "b = " << f.b << endl;//只能用對象類訪問非靜態數據成員

    cout << "staticVarible = " << staticVarible << endl ;//能夠直接訪問靜態數據成員

   printStaticVarible();//能夠直接訪問靜態成員函數



}

void main(){ 

    Number M(3,7,1);

    Number N(10,8,11);

   

/*------------兩種方式調用靜態成員函數-----------------*/

    M.printVaribles(M);//經過對象調用

    Number::printVaribles(N);//經過類名來調用

}


輸出結果:

a = 3

b = 7

staticVarible = 11

靜態成員函數 staticVarible = 11

a = 10

b = 8

staticVarible = 11

靜態成員函數 staticVarible = 11

相關文章
相關標籤/搜索