[討論] C++筆記 const篇
網誌好讀版:http://123android.blogspot.com/2012/02/cconst.html
新手還在入門,因為看了C++ Primer,對於const的介紹太過分散
稍微整理了幾本書的介紹,再利用網路上看到的例子做個解釋
因為很多觀念還不是很瞭解,因為還要再轉教學弟妹
所以有錯再煩請指教! 拜託拜託
常數(Const)
為Constant的縮寫「const」,是用一個變數來代表一個常使用的物件。
int pi = 3.14;
假設我們要設定圓周率pi為3.14,如果用上述方式設定的話,pi是可以變動的!!
pi=3.1;
pi=3.1415;
這對於程式來說是相當危險的事情,牽一髮動全身!
因此我們會在 pi宣告前加個「鎖」讓他沒辦法更動,就是「const」
const int pi = 3.14;
Const還可以被用來宣告函數,其用法相當多種,修飾不同的東西。
1.放在函數最後面(通常在class 類別宣告中)
其函數在執行過程中便不能修改資料成員,語法如下:
回傳資料型別 函數名稱(引數) 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 入門進階 文魁資訊
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.24.114.244
※ 編輯: jakevin 來自: 114.24.114.244 (02/05 20:28)
→
02/05 20:33, , 1F
02/05 20:33, 1F
→
02/05 20:35, , 2F
02/05 20:35, 2F
→
02/05 20:36, , 3F
02/05 20:36, 3F
→
02/05 20:36, , 4F
02/05 20:36, 4F
推
02/05 20:40, , 5F
02/05 20:40, 5F
→
02/05 20:45, , 6F
02/05 20:45, 6F
推
02/05 21:10, , 7F
02/05 21:10, 7F
推
02/05 21:26, , 8F
02/05 21:26, 8F
→
02/05 21:27, , 9F
02/05 21:27, 9F
→
02/05 21:27, , 10F
02/05 21:27, 10F
→
02/05 21:33, , 11F
02/05 21:33, 11F
→
02/05 22:09, , 12F
02/05 22:09, 12F
→
02/05 22:10, , 13F
02/05 22:10, 13F
→
02/05 22:10, , 14F
02/05 22:10, 14F
→
02/05 22:11, , 15F
02/05 22:11, 15F
→
02/05 22:30, , 16F
02/05 22:30, 16F
→
02/05 22:32, , 17F
02/05 22:32, 17F
→
02/05 22:43, , 18F
02/05 22:43, 18F
→
02/05 22:44, , 19F
02/05 22:44, 19F
→
02/05 22:46, , 20F
02/05 22:46, 20F
→
02/05 22:47, , 21F
02/05 22:47, 21F
→
02/05 22:51, , 22F
02/05 22:51, 22F
→
02/05 22:51, , 23F
02/05 22:51, 23F
→
02/05 22:52, , 24F
02/05 22:52, 24F
→
02/05 22:52, , 25F
02/05 22:52, 25F
→
02/05 23:03, , 26F
02/05 23:03, 26F
→
02/05 23:59, , 27F
02/05 23:59, 27F
→
02/06 00:00, , 28F
02/06 00:00, 28F
→
02/06 00:02, , 29F
02/06 00:02, 29F
→
02/06 00:07, , 30F
02/06 00:07, 30F
→
02/06 00:11, , 31F
02/06 00:11, 31F
→
02/06 00:32, , 32F
02/06 00:32, 32F
推
02/06 01:55, , 33F
02/06 01:55, 33F
→
02/06 02:07, , 34F
02/06 02:07, 34F
推
02/06 04:30, , 35F
02/06 04:30, 35F
→
02/06 04:32, , 36F
02/06 04:32, 36F
推
02/06 09:03, , 37F
02/06 09:03, 37F
※ 編輯: jakevin 來自: 140.124.77.157 (02/06 15:41)
→
02/06 15:50, , 38F
02/06 15:50, 38F
推
02/06 16:06, , 39F
02/06 16:06, 39F
→
02/06 16:56, , 40F
02/06 16:56, 40F
→
02/06 16:56, , 41F
02/06 16:56, 41F
→
02/06 17:08, , 42F
02/06 17:08, 42F
→
02/06 17:15, , 43F
02/06 17:15, 43F
→
02/06 17:18, , 44F
02/06 17:18, 44F
→
02/06 17:19, , 45F
02/06 17:19, 45F
→
02/06 17:19, , 46F
02/06 17:19, 46F
→
02/06 19:56, , 47F
02/06 19:56, 47F
→
02/06 20:35, , 48F
02/06 20:35, 48F
→
02/06 20:46, , 49F
02/06 20:46, 49F
→
02/06 21:53, , 50F
02/06 21:53, 50F
→
02/06 22:29, , 51F
02/06 22:29, 51F
→
02/07 10:03, , 52F
02/07 10:03, 52F
推
02/07 13:57, , 53F
02/07 13:57, 53F
推
02/08 01:01, , 54F
02/08 01:01, 54F
推
02/08 06:38, , 55F
02/08 06:38, 55F
→
02/08 08:56, , 56F
02/08 08:56, 56F