[討論] C++筆記 const篇

看板C_and_CPP作者 (真。假凱文)時間13年前 (2012/02/05 12:28), 編輯推噓10(10046)
留言56則, 17人參與, 最新討論串1/1
網誌好讀版: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
另外問一下 我的wxDev-c++最近編譯時會跑出木馬警告!
02/05 20:33, 1F

02/05 20:35, , 2F
其實最容易混淆的是const跟pointer混用的四種情況
02/05 20:35, 2F

02/05 20:36, , 3F
雖然很佩服你的費心整理,不過如果我是新手,看到這七種
02/05 20:36, 3F

02/05 20:36, , 4F
用法一定會覺得頭昏腦漲...XD
02/05 20:36, 4F

02/05 20:40, , 5F
很用心 推一個!!
02/05 20:40, 5F

02/05 20:45, , 6F
我今天花了一整天研究const 總算搞懂const的修飾
02/05 20:45, 6F

02/05 21:10, , 7F
我要推後來的example~不然我看不懂XD~
02/05 21:10, 7F

02/05 21:26, , 8F
#1EkLIycp http://cdecl.org/ 參考前面那篇,用後面
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
我也覺得記規則比較好XD
02/05 21:33, 11F

02/05 22:09, , 12F
酷耶 有解讀用的網站! 感謝diablo
02/05 22:09, 12F

02/05 22:10, , 13F
到時候教學弟妹,我會用這七個例子來教他們規則
02/05 22:10, 13F

02/05 22:10, , 14F
char **** const *** const *** cost *** const *** chast
02/05 22:10, 14F

02/05 22:11, , 15F
^n 囧
02/05 22:11, 15F

02/05 22:30, , 16F
syntax error XDD
02/05 22:30, 16F

02/05 22:32, , 17F
最後一個變成chast了...
02/05 22:32, 17F

02/05 22:43, , 18F
你累了嗎
02/05 22:43, 18F

02/05 22:44, , 19F
變數名稱是 chast 啊... 不過這不是重點啦 xD
02/05 22:44, 19F

02/05 22:46, , 20F
F的梗是什麼= =
02/05 22:46, 20F

02/05 22:47, , 21F
喔喔,原來是我誤會了XD
02/05 22:47, 21F

02/05 22:51, , 22F
可以問 兩個** 這是什麼意思?!
02/05 22:51, 22F

02/05 22:51, , 23F
pointer to pointer to ??
02/05 22:51, 23F

02/05 22:52, , 24F
a pointer that is point to a pointer.
02/05 22:52, 24F

02/05 22:52, , 25F
一個指向一個指標的指標。 翻成中文變得好詭異XD
02/05 22:52, 25F

02/05 23:03, , 26F
難怪大家說會c的英文都很好
02/05 23:03, 26F

02/05 23:59, , 27F
char ** pp=declare pp as pointer to pointer to ch
02/05 23:59, 27F

02/06 00:00, , 28F
ar那個網站翻的~_~
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
一個脫褲子放屁的例子 http://ideone.com/2k3YP
02/06 00:11, 31F

02/06 00:32, , 32F
動態矩陣阿~
02/06 00:32, 32F

02/06 01:55, , 33F
假凱文竟然也在C版出沒 推整理!!!
02/06 01:55, 33F

02/06 02:07, , 34F
這樣的整理不夠,都沒人想到define或typedef嗎?
02/06 02:07, 34F

02/06 04:30, , 35F
(const) int pi = 3.14; 好歹改成 (const) double pi .
02/06 04:30, 35F

02/06 04:32, , 36F
外一題,const 宣告之變數習慣上是全大寫,代表唯讀。
02/06 04:32, 36F

02/06 09:03, , 37F
我在想第一點是不是應該強調他是class member function?
02/06 09:03, 37F
※ 編輯: jakevin 來自: 140.124.77.157 (02/06 15:41)

02/06 15:50, , 38F
所以你教授要你教oo?
02/06 15:50, 38F

02/06 16:06, , 39F
淺顯易懂
02/06 16:06, 39F

02/06 16:56, , 40F
要教VB C 還有SQL
02/06 16:56, 40F

02/06 16:56, , 41F
另一個教C#
02/06 16:56, 41F

02/06 17:08, , 42F
要不要換教授? 你教授到底想幹麼?
02/06 17:08, 42F

02/06 17:15, , 43F
LAB系統維護跟開發阿,歷屆學長下來 五六套要維護
02/06 17:15, 43F

02/06 17:18, , 44F
樓上是下一個神人.難怪要先打下c++的基礎.主要是要你們
02/06 17:18, 44F

02/06 17:19, , 45F
快速摸熟c,c#吧! 竟然還有用嵌入式語言.你以後找工作很
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
**這個我在深度學習C++找到了!! 5.6節有
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
http://goo.gl/1GDy0 一篇搞定
02/07 13:57, 53F

02/08 01:01, , 54F
樓上網址的教學好強阿~~~真的一篇搞定0.0 加到最愛
02/08 01:01, 54F

02/08 06:38, , 55F
推avhacker大的網站
02/08 06:38, 55F

02/08 08:56, , 56F
好威啊!!!
02/08 08:56, 56F
文章代碼(AID): #1FBdNZZA (C_and_CPP)