C++ Tips 第一回:那個風情萬種的const啊!

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;

你可能會想:爲何會有三種呢?親!不是隻有兩種結果嗎?這不是真的,p1p2p3當中必定有一個是錯誤的結合!

我告訴你,這三種都是他們合法的愛情的結晶。另外,誰告訴你,相同的結果只能有一種表達方式了?好比不管 是西紅柿炒雞蛋,仍是雞蛋炒西紅柿,仍是番茄雞蛋,這都是同樣同樣同樣的啊!親!

p1p2實際上是同樣的!都是指向const類型的指針,也就是說,不能經過p1p2,來分別改變ab的值。不過,慶幸的是,p1p2在指向一個對象之後,不必定非得一棵樹上吊死,它倆還能夠指向別的對象。就好像,若是你結婚後對方不能帶給你幸福,而本身又沒法改變對方。那麼,看完這個類型的指針,你就知道了,都什麼年代了!你能夠離婚去追求本身的幸福啊,親!

p3const類型的指針。它一旦指向某一個對象,那麼這輩子就只能指向它了。正所謂嫁雞隨雞,嫁狗隨狗。忠貞不二!這是中國男人心目中的好老婆。固然,p3也是好指針。當你和一個老外交談,說到一個比較好的觀點時,對方每每會說,good point!什麼意思呢?就是good pointer的口語簡化,就是「好指針」的意思!

不過,p3若是看對方不爽,能夠改變它!此時,個人腦海裏浮現出不少別人老婆的光輝形象,好比俞敏洪的老婆啊,李彥宏的老婆啊。這些老婆們,都是good point!

正所謂龍生九子,各有不一樣。p1p2p3這哥仨,通過const和指針的雜交,在外形和功能上至少有一方面不一樣,那麼咱們到底怎麼區分呢?

const想成老婆,把int(或者別的變量類型)想成第三者,那麼老婆和你站在同一邊的,也就是都在* 號右邊的,遠離第三者的,就是患難與共,榮辱與共,也就是咱們所說的好老婆,就是const類型的指針;而老婆和你在* 號兩邊的,離第三者總比離你近的呢?就是屬於同牀異夢的,就是指向const類型的指針。正所謂夫妻本是同林鳥,大難臨頭各自飛。p1p2的日子很差過啊。

若是我說這麼形象你還記不住,那麼……記得常喝六個核桃!

2、三個孩子還有故事

簡單說說這仨倒黴孩子。

1.孩子們的指向到底有沒有問題?

指向const類型的指針,也就是p1p2,通常是用來指向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,老是有說不完的話題。可是基本萬變不離其中吧。運用基本知識,解決複雜問題。若是之後真有什麼我以爲能夠補充的,再開博客再詳談吧。

真佩服那些有毅力的人,能從頭看到這裏。

相關文章
相關標籤/搜索