「const」為Constant的縮寫,是用一個變數來代表一個常使用的物件。
int pi = 3.14;假設我們要設定圓周率pi為3.14,如果用上述方式設定的話,pi是可以變動的!!
pi=3.1; pi=3.1415;這對於程式來說是相當危險的事情,牽一髮動全身!
因此我們會在 pi宣告前加個「鎖」讓他沒辦法更動,就是「const」
下面段意思是,const 一個 int p = 3.14 的變數
const int pi = 3.14;下面段意思是,const p = 3.14 的變數,而這變數是個int,兩著有些許不同,但效果一樣
int const pi = 3.14;
Const還可以被用來宣告函數,其用法相當多種,修飾不同的東西。
1.放在函數最後面(在類別宣告中)
其函數在執行過程中便不能修改資料成員,語法如下:
回傳資料型別 函數名稱(引數) const {函式內容}
int f1(int x) const {/...../}2.放在函數最前面
其回傳值將是const,語法如下:
const 回傳資料型別 函數名稱(引數)
const int f2(int x) {/...../}3.放在引數變數前
其引數將變為const,語法如下:
回傳資料型別 函數名稱(引數型別 const 引數)
int f3(int const x) {/...../}4.放在引數前,而引數為指標變數
其指標變數所指示的變數將變為const,語法如下:
回傳資料型別 函數名稱(引數型別 const *引數)
int f4(int const *x) {/...../}或是
回傳資料型別 函數名稱(const 引數型別 *引數)
int f4(const int *x) {/...../}5.放在引數前,而引述為指標變數前
其參考變數所參考的變數將變為const,語法如下:
回傳資料型別 函數名稱(引數型別 const &引數)
int f5(int const &x) {/...../}6.引數設const,再設為指標變數
其指標引數將變為const,語法如下:
回傳資料型別 函數名稱(引數型別 *const 引數)
int f6(int *const x) {/...../}7.引數設const,再設為指標變數,再加上const
其指標引數將變為const,且所指引的變數將為const,語法如下:
回傳資料型別 函數名稱(引數型別 *const 引數)
int f7(const int *const x) {/...../}
總結:
class Book{ private: //資料成員 int c ; string name; public: Book(){ c=0; } int f1(int x) const { c = 1 ;//錯誤!! set_name函式為const函式,不可更動資料成員 } const int f2(int x){ x++; c++; return c; } int f3(int const x){ x++; //錯誤!! x為const變數 c++; return c; } int f4(int const *x){ (*x)++; //錯誤,因為原本指向的變數被設定為const了 *x++; //正確,意思是*(x++),只是改變x的記憶體位置,再指定到變數 return c; } int f5(int const &x){ x++; //錯誤!x所參考的變數已經是const,x也是個const return c; } int f6(int *const x){ (*x)++; //正確,x是const,但x所指引的變數並非const,可對其做++動作 *x++; //錯誤!意思是*(x++),x已經是const,所以不可更動記憶體位置 return c; } int f7(const int *const x){ (*x)++; //錯誤!x所參考的變數已經是const,x也是個const *x++; //錯誤!意思是*(x++),x已經是const return c; } };參考文獻:
1. http://csie-tw.blogspot.com/2010/03/c-constconst-pointer-pointer-to-const.html
2. C++ primer 4/e 中文版 侯傑老師譯
3. Visual C++ 2005 ecpress 入門進階 文魁資訊