「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 入門進階 文魁資訊