2013年一月份在別的地方寫的博客,如今搬過來。回頭看看,那時候的文風還真是有趣呢~函數
《C++ Primer》這本書帶看不看的好多年了。每過一段時間,就拿出來看看。書都折膠了。常看的章節也都泛黃了。可是不少細小可是很重要的點仍然記不住。老是翻看時記得很清楚,可是過一段時間就模糊了。之前老是想把這本厚得跟轉頭同樣的書的要點整理出來,弄成一個很薄很薄的內容。這樣每過一段時間就翻出來看看,容易複習。指針
最近想,爲什麼不整理在微博裏呢?這樣共享出來,還能給朋友們一塊兒看看。固然,看這些內容的人,我但願你仍是要有點相關知識的基礎的。由於我不會從零開始。若是沒看過《C++ Primer》,就得本身先看看了。code
好吧,第一次廢話比較多。今天我們就聊一聊關鍵字const
。對象
const
,你們都知道,表示這個量是個常量,不能變化。也就是說,凡是用它修飾的東西,必須在聲明的時候給它初始化,否則這個東西(就是常量)就再也沒有被改變的機會了。好比:生命週期
const int MAXNUM = 100;
這就代表,MAXNUM
在它活在世上這一生裏(就是生命週期中),就只能是100了。從生到死,始終心口如一,平靜如水,毫無變化。內存
這很簡單吧?本來一切都是這麼簡單,這麼美好。可是當const
遇到別的東西的時候,一切都開始複雜了,開始讓人捉摸不定,讓人困惑。就比如人生,本身一我的老是很簡單,當你開始戀愛了,有家庭了,有孩子了,一切都變了。就連生活習慣均可能改變了!博客
1、當簡單明瞭的const
遇到萬惡的指針,註定會產生峯迴路轉、曲折離奇的愛情故事產品
指針,萬惡之源。產品裏不少的bug,都是來源於指針。什麼指針沒釋放,致使內存溢出啊;什麼指針還須要使用,指向的內存空間就被釋放了啊。有人說C++和C難學難用的緣由之一,就是由於要本身管理指針。這話有點道理。it
那麼若是const
愛上指針,會產生什麼呢?可能你們張嘴就能說,固然是「const
類型的指針」和「指向const
類型的指針」啦!微博
不過,可能令你很驚訝的是:const
和指針之間的體位卻有三種!看下面的code:
int a = 1; int b = 2; int c = 3; int d = 4; int const* p1 = &a; const int* p2 = &b; int* const p3 = &c;
你可能會想:爲何會有三種呢?親!不是隻有兩種結果嗎?這不是真的,p1
、p2
、p3
當中必定有一個是錯誤的結合!
我告訴你,這三種都是他們合法的愛情的結晶。另外,誰告訴你,相同的結果只能有一種表達方式了?好比不管 是西紅柿炒雞蛋,仍是雞蛋炒西紅柿,仍是番茄雞蛋,這都是同樣同樣同樣的啊!親!
p1
和p2
實際上是同樣的!都是指向const類型的指針,也就是說,不能經過p1
和p2
,來分別改變a
和b
的值。不過,慶幸的是,p1
和p2
在指向一個對象之後,不必定非得一棵樹上吊死,它倆還能夠指向別的對象。就好像,若是你結婚後對方不能帶給你幸福,而本身又沒法改變對方。那麼,看完這個類型的指針,你就知道了,都什麼年代了!你能夠離婚去追求本身的幸福啊,親!
p3
是const
類型的指針。它一旦指向某一個對象,那麼這輩子就只能指向它了。正所謂嫁雞隨雞,嫁狗隨狗。忠貞不二!這是中國男人心目中的好老婆。固然,p3
也是好指針。當你和一個老外交談,說到一個比較好的觀點時,對方每每會說,good point!什麼意思呢?就是good pointer的口語簡化,就是「好指針」的意思!
不過,p3
若是看對方不爽,能夠改變它!此時,個人腦海裏浮現出不少別人老婆的光輝形象,好比俞敏洪的老婆啊,李彥宏的老婆啊。這些老婆們,都是good point!
正所謂龍生九子,各有不一樣。p1
、p2
、p3
這哥仨,通過const
和指針的雜交,在外形和功能上至少有一方面不一樣,那麼咱們到底怎麼區分呢?
把const
想成老婆,把int
(或者別的變量類型)想成第三者,那麼老婆和你站在同一邊的,也就是都在* 號右邊的,遠離第三者的,就是患難與共,榮辱與共,也就是咱們所說的好老婆,就是const
類型的指針;而老婆和你在* 號兩邊的,離第三者總比離你近的呢?就是屬於同牀異夢的,就是指向const
類型的指針。正所謂夫妻本是同林鳥,大難臨頭各自飛。p1
和p2
的日子很差過啊。
若是我說這麼形象你還記不住,那麼……記得常喝六個核桃!
2、三個孩子還有故事
簡單說說這仨倒黴孩子。
1.孩子們的指向到底有沒有問題?
指向const
類型的指針,也就是p1
和p2
,通常是用來指向const
類型的對象的。這本無可厚非。可是,他們可不能夠指向非const
類型的對象呢?
答案是:能夠滴!
不過,咱們仍然不能經過這類指針去改變他們所指向的對象的值。爲何呢?緣由就是p1和p2這哥倆天生就有缺陷。只要讓他們指向了,看誰都是const
類型的對象!可悲嗎?
因此夫妻生活必定要幸福,否則生下來的小孩都不健康哦~
那麼,你們很快會想到p3
了。const
類型的指針呢?const
類型的指針能夠指向非const
類型的對象,可是它堅定不會去指向const
類型的對象。由於,它知道,它是要改變對方的,若是對方不向它敞開心扉,它乾脆放棄。
順便說一句,void*
指針不能用來指向const類型對象,必須用const void*
。
2.偶爾有別的東西出來客串,再腦殘也是要交朋友的!
再來看看這個code:
typedef int *intPoint; const intPoint p5;
那麼p5究竟是「const
類型的指針」仍是「指向const
類型的指針」?
你們必定會說p5
是「指向const
類型的指針」。嗯,可是錯了!哈哈!其實人家p5
是「const
類型的指針」呢~
爲何呢?估計你們是內聯的展開了intPoint
。其實也沒錯。可是無論怎樣,intPoint
始終是個指針,那麼const
修飾指針,那固然是「const
類型的指針」啦!
3、還有一個私生子,噓~能不說就不說吧!
看下面的code:
int d = 4; const int* const p4 = &d;
這種指針不多露面。通常都隱匿起來。爲何呢?由於這個是「指向const類型的const指針」。這類指針,一旦初始化以後,既不能經過它改變指向類型的值,也不能指向別的指針。因此基本上就是個廢物,出場率不高。
想一想吧,同時娶兩個老婆(const
),在新中國已經不容許了!雖然不少男人都想這樣……
4、當const
爲函數打工,小祕和老闆之間總有無限引人遐想的故事
一個類裏的成員函數,它不想改變類裏的任何成員變量。可是它本身沒有這個自制力,因此想找人來管管。因而乎,它找到了const
。看這一段code,這是一個定義在類Sales_item
外面的成員函數,摘自《C++ Primer》第四版:
double Sales_item::avg_price() const { if (units_sold) return revenue/units_sold; else return 0; }
avg_price()
沒有改變任何的成員變量,事實上,它想改也改不了。一切都在const的嚴格控制當中。const的限定很是嚴格,我猜它是處女座的!
固然,咱們只有const
成員函數。若是不在類裏,就沒有const
函數。你能夠把在類裏的函數想象成在體制內的部門。這種部門老是約束這約束那,因此得有const
。可是體制外的,社會閒雜人等,不須要什麼約束。
5、結束語
說了這麼多,有可能有遺漏的。畢竟關於const
,老是有說不完的話題。可是基本萬變不離其中吧。運用基本知識,解決複雜問題。若是之後真有什麼我以爲能夠補充的,再開博客再詳談吧。
真佩服那些有毅力的人,能從頭看到這裏。