作者jakevin (真。假凱文)
看板C_and_CPP
標題[討論] C++筆記 const篇
時間Sun Feb 5 20:28:15 2012
網誌好讀版:
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)
→ jakevin:另外問一下 我的wxDev-c++最近編譯時會跑出木馬警告! 02/05 20:33
→ james732:其實最容易混淆的是const跟pointer混用的四種情況 02/05 20:35
→ james732:雖然很佩服你的費心整理,不過如果我是新手,看到這七種 02/05 20:36
→ james732:用法一定會覺得頭昏腦漲...XD 02/05 20:36
推 yayarice:很用心 推一個!! 02/05 20:40
→ jakevin:我今天花了一整天研究const 總算搞懂const的修飾 02/05 20:45
推 villix:我要推後來的example~不然我看不懂XD~ 02/05 21:10
→ diabloevagto:的網站解讀,我相信會比背哪些好懂 02/05 21:27
→ diabloevagto:我相信記住解讀的規則,比記住這七種情況容易多 02/05 21:27
→ james732:我也覺得記規則比較好XD 02/05 21:33
→ jakevin:酷耶 有解讀用的網站! 感謝diablo 02/05 22:09
→ jakevin:到時候教學弟妹,我會用這七個例子來教他們規則 02/05 22:10
→ Favonia:char **** const *** const *** cost *** const *** chast 02/05 22:10
→ Favonia: ^n 囧 02/05 22:11
→ diabloevagto:syntax error XDD 02/05 22:30
→ james732:最後一個變成chast了... 02/05 22:32
→ jakevin:你累了嗎 02/05 22:43
→ Favonia:變數名稱是 chast 啊... 不過這不是重點啦 xD 02/05 22:44
→ diabloevagto:F的梗是什麼= = 02/05 22:46
→ james732:喔喔,原來是我誤會了XD 02/05 22:47
→ jakevin:可以問 兩個** 這是什麼意思?! 02/05 22:51
→ jakevin: pointer to pointer to ?? 02/05 22:51
→ james732:a pointer that is point to a pointer. 02/05 22:52
→ james732:一個指向一個指標的指標。 翻成中文變得好詭異XD 02/05 22:52
→ jakevin:難怪大家說會c的英文都很好 02/05 23:03
→ diabloevagto:char ** pp=declare pp as pointer to pointer to ch 02/05 23:59
→ diabloevagto:ar那個網站翻的~_~ 02/06 00:00
→ jakevin:** 這個有常用嗎? 感覺頗極端的 02/06 00:02
→ james732:** 其實還挺常用的,當你想要修改一個指標指向的位置 02/06 00:07
→ WJAider:動態矩陣阿~ 02/06 00:32
推 Yshuan:假凱文竟然也在C版出沒 推整理!!! 02/06 01:55
→ bleed1979:這樣的整理不夠,都沒人想到define或typedef嗎? 02/06 02:07
推 tropical72:(const) int pi = 3.14; 好歹改成 (const) double pi . 02/06 04:30
→ tropical72:外一題,const 宣告之變數習慣上是全大寫,代表唯讀。 02/06 04:32
推 CrBoy:我在想第一點是不是應該強調他是class member function? 02/06 09:03
※ 編輯: jakevin 來自: 140.124.77.157 (02/06 15:41)
→ angleevil:所以你教授要你教oo? 02/06 15:50
推 clamperni:淺顯易懂 02/06 16:06
→ jakevin:要教VB C 還有SQL 02/06 16:56
→ jakevin:另一個教C# 02/06 16:56
→ angleevil:要不要換教授? 你教授到底想幹麼? 02/06 17:08
→ jakevin:LAB系統維護跟開發阿,歷屆學長下來 五六套要維護 02/06 17:15
→ angleevil:樓上是下一個神人.難怪要先打下c++的基礎.主要是要你們 02/06 17:18
→ angleevil:快速摸熟c,c#吧! 竟然還有用嵌入式語言.你以後找工作很 02/06 17:19
→ angleevil:輕鬆 02/06 17:19
→ jakevin:希望啦 因為我們是工管所 而不是資工資管.... 02/06 19:56
→ jakevin:**這個我在深度學習C++找到了!! 5.6節有 02/06 20:35
→ loveme00835:程式語言, 不是資工就學比較多好嗎...? 02/06 20:46
→ diabloevagto:樓上中肯! 02/06 21:53
→ jakevin:板大你誤會了,我指的是寫程式的底子跟上的課程 02/06 22:29
→ angleevil:寫程式的底子跟上的課程<--那也要吸收進去 02/07 10:03
推 csihcs:樓上網址的教學好強阿~~~真的一篇搞定0.0 加到最愛 02/08 01:01
推 ppc:推avhacker大的網站 02/08 06:38
→ jakevin:好威啊!!! 02/08 08:56