[爆卦]C const是什麼?優點缺點精華區懶人包

為什麼這篇C const鄉民發文收入到精華區:因為在C const這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者jakevin (真。假凱文)看板C_and_CPP標題[討論] C++筆記 const篇時間S...


網誌好讀版: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:#1EkLIycp http://cdecl.org/ 參考前面那篇,用後面 02/05 21:26
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
james732:一個脫褲子放屁的例子 http://ideone.com/2k3YP 02/06 00:11
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
avhacker:http://goo.gl/1GDy0 一篇搞定 02/07 13:57
csihcs:樓上網址的教學好強阿~~~真的一篇搞定0.0 加到最愛 02/08 01:01
ppc:推avhacker大的網站 02/08 06:38
jakevin:好威啊!!! 02/08 08:56

你可能也想看看

搜尋相關網站