使用static與const關鍵字時需要掌握的知識

static:
1、不考慮類,static的作用:

    1)第一個作用:隱藏。使得全局變量和函數對其它文件不可見,同時避免了不同文件的命名衝突。
    2)第二個作用:默認初始化爲0。未初始化的全局靜態變量和局部靜態變量都保存在BBS段,BBS段的特點是,程序運行之前會自動清零。
    3)第三個作用:保持局部變量內容的持久性。此變量聲明週期是整個程序的聲明週期,但是作用域只在聲明它的函數中。

2、類中的static,表示屬於某個類單數不屬於類的任何特定對象的變量和函數。
    1)對於類的靜態數據成員:
        a、類的靜態數據成員獨立於該類的任意對象而存在;其值的修改被類的所有對象看見。
        b、static數據成員必須在類定義的外部定義,通常放在包含類的非內聯成員函數定義的文件中。
        class A
        {
            stctic double d = 0.03;//錯誤
        };
        c、但是也有例外,const static 數據成員可以在類的定義體中進行初始化,因爲const定義時必須初始化。

    2)對於類的成員函數:
        a、static成員函數由於不與任何對象關聯,因此它不具備this指針,因此,它無法訪問屬於類對象的非靜態數據成員,也無法訪問
        非靜態成員函數。也就是說,類的靜態成員函數,只能調用該類的其它靜態成員函數和靜態數據成員。
        b、static成員不是任何對象的組成部分,所以成員函數不能被聲明爲const。此外,static成員函數也不可以聲明爲virtual,volatile。

    關於靜態成員函數的總結:
    (1)靜態成員之間可以相互訪問,不能訪問非靜態成員。非靜態成員函數可以任意訪問靜態和非靜態成員。
    (2)靜態函數執行速度比非靜態函數稍快。

const:
1、const定義後就不能修改,因此定義時要初始化。


2、在C語言中
    const buffsize = 10;
    int buf[buffsize];
    是錯誤的;
    而在C++中是正確的。C中改爲const int buffsize;


3、使用const比使用#define有更多的優點:
    1)const常量有數據類型,而宏常量沒有。前者可以進行類型安全檢查,而後者只是進行簡單的字符替換。
    2)使用const可能比#define得到更小的目標代碼,因爲替換可能會是同一變量在不同的地方有多個備份。
    3)const執行常量摺疊,編譯時可以把一個複雜的常量表達縮減成簡單的。
總之,我們建議使用const替換#define


4、指針和const修飾符:
    記住以下一個規則就足夠了,即以'*'爲分界,左邊是對象,右邊是指針。
    1)const在左邊表示指針指向const對象,指針可變,對象不可變。
    2)const在右邊表示const指針,指針不可修改,對象可以修改。

5、const修飾函數參數
    1)const形參可以接受非const實參,但是非const形參不兼容const實參。因此,我們爲了避免這種問題,儘量使用const修飾形參。
    2)由於gcc下,臨時對象是const類型,基於1),形參必須聲明爲const類型,否則出錯。

6、const在類中的應用
    1)this指針是const,假設base是一個類,這 base *const this;
    2)而const修飾的成員函數,其this指針指向的是一個const對象,即 const base *const this;const成員函數不能修改調用該函數的對象。
    3)非const對象,既可以調用const成員函數,也可以調用非const成員函數;而const對象,只能調用const成員函數。
    4)const數據成員,必須在構造函數的成員初始化列表中進行初始化。

7、關於C++中,static、const以及static,const成員變量的初始化:
在C++中,static成員變量只能在類的內部聲明不能再類內部進行初始化,通常在類的實現文件中初始化,static關鍵字只能用於類定義體內部聲明中,定義時不能標示爲static。
在C++中,const成員變量也不能再類定義處初始化,只能通過構造函數初始化列表進行,並且必須有構造函數。const數據成員只在某個對象聲明週期內是常量,而對於整個類而言,確實可變的。因爲類可以創建多個對象,不同對象其const數據成員的值可以不同,所以不能再類聲明中初始化const數據成員,因爲對象沒有被創建,編譯器不知道const數據成員的值是什麼。
const數據成員的初始化只能在類的狗仔函數的初始化列表中進行,想要建立整個類中都恆定的常量,應該用類中的枚舉常量來實現,或者static const 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章