1. 程式人生 > >C++老鳥日記028 有關const的一點知識

C++老鳥日記028 有關const的一點知識

微信公眾號: 星點課堂

新浪微博:女兒叫老白

網易雲課堂:女兒叫老白

網易雲課堂免費課程:《C++跨平臺開發中的編譯錯誤》

網易雲課堂免費課程:《C++老鳥日記》

----------------------------------------------------------------------------

引言:

----------------------------------------------------------------------------

       在C++程式設計中,我們經常會用到一些常量、或者常量指標、常量引用、不改變成員變數的函式等等,這些統統都會用到const,我們今天就來討論一下const的相關知識。

正文:

----------------------------------------------------------------------------

       在C++中,const預設為內部連結,也就是僅在定義它的編譯單元可見(比如某個檔案中)。一般我們會把const定義的量放在標頭檔案中,這樣只需要包含該標頭檔案就可以使用該const資料了。定義一個const時,必須給它賦初值,除非用extern進行宣告。

       extern const float pi;

       我們可以對const進行數學計算得到其他的const值,比如:

       const int c_maxNumber1 = 10;

       const int c_maxNumber2 = c_maxNumber1 + 5;

       char szBuf[c_MaxNumber+1];

       當我們定義一個const並初始化之後,就無法再修改其值,否則編譯器就會報錯。

       const還用來修飾指標,請看如下兩種編碼方式含義是否一樣?

const float* p;

float const * p;

       這兩句程式碼都沒有給p賦初值,它們都表示u是一個指標,它指向一個const int;這是指向const的指標;那麼const指標是何含義(8.2.2, para2)。我們看下列程式碼:

int val = 0;

int * const p = &val;

p是一個const指標(它的值不可改變,所以必須初始化),它指向一個int地址。

看了這些內容,是不是有點暈?其實,我們可以簡單記憶:const一般放在被修飾者的右側,因此,這就容易理解了:p是一個指向int的指標,而int指標的值不可改變,也就是p不可改變。再看下面的程式碼:

int val = 0;

int const* const p = &val;

p是一個const指標,它指向一個int地址,該地址的內容為const(不可改變),因此指標和物件都不可改變。

我們來放鬆一下,看點簡單的。在函式定義中,函式的引數如果在函式體重不被改變,我們通常會把他們定義為const引用引數進行傳入,比如:

CParam getParam(const CMyClass& myclass);

這樣,可以有效提高執行效率:因為傳遞的是引用就省去了拷貝構造的過程,而因為是const,表明該物件不會被修改,否則編譯器會報錯。

如果我們在一個類的成員函式中,非常明確的知道不會修改成員變數的值,那麼就可以把這個函式宣告為const,比如:

// myclass.h

class CMyClass {

public:

int getValue()const {return m_nValue;}

int setValue(int val) {m_nValue=val;}

       private:

              int m_nValue;

};

我們還可以為函式返回值指定const修飾,這表明返回的資料不允許被修改,比如stl的string有一個介面c_str(),這個介面就返回const _Elem*,表明返回的地址所指向的內容不允許被修改。

如果我們希望定義一個常量length,而我們想把這個常量名字(length)用在各個不同的類中,那麼就可以在類這種用const定義一個成員變數。如果一個const被用在了類裡,那麼用const定義的成員必須在建構函式的最初階段初始化,我們來看一下它如何初始化;

       // array.h

       class CArray {

public:

           CArray(int len) : m_nLength(len), m_nStep(5) {}

private:

           int m_nLength;

           int m_nStep;

};

       在這段程式碼中,m_nLength必須在冒號之後、花括號之前初始化,如果寫成這樣就錯了:

CArray(int len) {

m_nLength = len;

m_nStep=5;

}

   因為m_nLength不允許被修改(賦值),即使在建構函式體中也不行。

結語:

----------------------------------------------------------------------------

       const被廣泛用在常量定義、函式引數修飾、函式返回值修飾、函式體修飾等方面,我們可以充分藉助const的各種不同應用場景來發揮它的強大作用。