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的各種不同應用場景來發揮它的強大作用。