【計(jì)算機(jī)本科補(bǔ)全計(jì)劃】《C++ Primer》const限定符和處理類型

繼續(xù)放我“新垣結(jié)衣”出來(lái)吸粉

正文之前

看了一天《C++ Primer 第五版》傍睹,好爽案羰ⅰ!不過(guò)收獲不是很大拾稳,而且還有不少的地方不太懂骚亿,但是還是把我的收獲分享出來(lái)!希望大家喜歡吼~~

正文

1熊赖、 頂層const
  • 眾所周知来屠,指針本身就是一個(gè)對(duì)象,不依附于別的對(duì)象而存在著震鹉,也就意味著指針定義的時(shí)候不需要初始化俱笛。所以對(duì)于指針這個(gè)東西來(lái)說(shuō)。其本身與其所指向的對(duì)象是不是常量本身就是獨(dú)立的事情传趾。那么我們用頂層const來(lái)表示指針本身就是一個(gè)常量迎膜,也就是常指針,用底層const來(lái)表示指針?biāo)赶虻膶?duì)象是常量浆兰,那么我們可以知道:
const int i=21;
const int *const p= &i  

代表著p是一個(gè)指向常量的常指針磕仅,也就是說(shuō)其本身就兼具了頂層const和底層const的特性。

  • 注意注意tこ省榕订!必須在* 跟p之間加一個(gè)const,才是表示的常指針,否則兩個(gè)const就是重復(fù)定義:

修改之后就是完整的指向常量的常指針:

  • 如果只有一個(gè)const:
const int i=21;
const int *p= &i 

那么其實(shí)這個(gè)意思是蜕便,p是一個(gè)指針劫恒,指向一個(gè)const常量,沒(méi)錯(cuò)轿腺,const只用來(lái)表示&i中的i是一個(gè)常量两嘴,而不管你p這個(gè)指針的效果。

  • 所以兩個(gè)const 定義的話是分別給p加持了頂層和底層的const特性族壳,如果只有一個(gè)const 憔辫,那么上面的代碼是底層const ,也就是說(shuō)是指向常量仿荆,本身不是常指針贰您。下面是常指針喧务,頂層const的特性:
const int i=21;
int *const p= &i;
  • 另外,注意M髌浴!拷貝操作庐冯,必須是拷貝方與被拷貝方有著相同的底層const特性(頂層特性不考慮)孽亲,否則是會(huì)報(bào)錯(cuò)的,如下:
const int i=21;
const int *p1=&i;
const int *p2=p1;    //正確展父,因?yàn)閜2已經(jīng)在const那兒申明了我是指向一個(gè)常量的返劲,所以因?yàn)閜1具備底層const 可以被p2拷貝 
int *p3=p1;   //所以這毫無(wú)疑問(wèn)是錯(cuò)誤的,因?yàn)槟鉷3啥const特性都不具備栖茉,咋去拷貝一個(gè)具有底層const特性的指針篮绿?

別問(wèn)我為啥,C++11就這么規(guī)定的吕漂!要從計(jì)算機(jī)組成說(shuō)我還沒(méi)學(xué)那么深亲配!另外其實(shí)每一個(gè)直接定義常量的都是天生具備頂層const特性,比如const int i=21;

2惶凝、 constexpr和常量表達(dá)式
  • 常量表達(dá)式兩大特性:
    • 本身值不會(huì)改變吼虎,const type
    • 能夠在編譯過(guò)程中得到計(jì)算結(jié)果,而不需要等別的輸入

就好比下面:

const int max=1; 
const int min=size();

第一行的max就是常量表達(dá)式苍鲜,而第二行的min就不是思灰,因?yàn)閟ize()必須在運(yùn)行之后才知道結(jié)果。

  • constexpr變量混滔,這個(gè)跟const很像洒疚。constexpr是新標(biāo)準(zhǔn)中允許變量聲明為constexpr以便由編譯器驗(yàn)證變量是不是常量表達(dá)式而產(chǎn)生的!具體的作用后面說(shuō)坯屿,我也還沒(méi)摸清楚

  • 至于constexpr的另一個(gè)特性油湖,那就是如果用它定義一個(gè)指針,那么它只針對(duì)指針领跛,而對(duì)指針指向的對(duì)象毫不關(guān)心(官方術(shù)語(yǔ)是:constexpr把其定義的對(duì)象置為頂層const)肺魁。下面是區(qū)別所在:

const int *p=&i;   //定義了一個(gè)指向整形常量的非常量指針;
constexpr int *p=&i;  //定義了一個(gè)指向整數(shù)的常量指針8艚凇鹅经!
  • 如果要定義指向常量的常量指針,那么就需要下面這一句:
constexpr const int *p=&i
3怎诫、 類型別名

類型別名有兩種方法:

  • 傳統(tǒng)的方式是:typedef
typedef double wages;

此時(shí)的話瘾晃,見(jiàn)wages如見(jiàn)double。你可以用wages做任何double能做的事情:

wages file=12.1;
typedef wages *base;

上面兩句中幻妓,第一句定義了一個(gè)雙精度的變量file并且初始化了蹦误。第二句則是給wages *(相當(dāng)于是double * )再次定義了一個(gè)別名劫拢,那就是base ,所以以后base就代表了“double類型的指針變量”這一個(gè)固定標(biāo)簽强胰。但是有一個(gè)巨坑舱沧,那就是要跟宏定義區(qū)分開(kāi)來(lái)!E佳蟆熟吏!這個(gè)是超級(jí)重要的!下面見(jiàn)例子:

typedef double *base;
const base cs=&hi;
const double *cs1=&hi;

如果一不小心玄窝,我們會(huì)以為cs是一個(gè)指向常量hi的指針牵寺,指針對(duì)象本身是一個(gè)非常量,跟第三行cs1是一樣的恩脂。但是事實(shí)是:cs是一個(gè)指向double的常量指針帽氓,base據(jù)定了它是一個(gè)指向double的指針,然后const再限定了cs是一個(gè)常量俩块,這是針對(duì)指針本身的黎休,其效果等同于

double *const cs=&hi;    //   ===  const base cs=&hi;
  • 另外一種別名方式是:using
using base =double;

上述兩種方式效果等同。

4玉凯、 auto類型說(shuō)明符
  • auto的作用是讓編譯器代替我們?nèi)シ治霰磉_(dá)式所述的類型奋渔。但是請(qǐng)注意,auto一次只能分析一種類型壮啊,無(wú)法分析多種嫉鲸,也就是說(shuō),如下:
auto i=0,*p=&i;
auto sz=0,pi=3.14;

第一句是對(duì)的歹啼,可以分析出來(lái)玄渗,auto在第一句中等效int,而第二句中狸眼,sz是int類型藤树,pi是浮點(diǎn)數(shù),很顯然是無(wú)法同時(shí)自動(dòng)判定兩種類型的拓萌, 所以報(bào)錯(cuò)了K甑觥!

  • auto的一些特性

1)auto在引用中忽略”引用“這一類型微王,而是直接返回引用綁定的對(duì)象類型

int i=0,&r=i;
auto a=r;   //(這里的auto會(huì)返回一個(gè)int 類型 而不是int &這個(gè)引用的類型)

2)auto會(huì)忽略頂層的const 屡限,但是會(huì)保留底層const,比如說(shuō):

const int ci=i;
auto b=ci;
auto c=&ci
*c=i;

3)看得出來(lái)炕倘,b是自動(dòng)忽略了ci的頂層const特性钧大,而不會(huì)忽略底層特性,所以第四行會(huì)報(bào)錯(cuò)罩旋,如下圖:


4)如果希望auto類型被推斷出一個(gè)頂層const特性啊央,那么如下即可:

const auto f=ci;

5)設(shè)置一個(gè)引用的時(shí)候眶诈,會(huì)保留頂層常量的屬性,因此初始值必須是相同的類型的瓜饥,下面一對(duì)一錯(cuò):

auto &m=ci,*p=&ci; //都是對(duì)整形常量的引用
auto &n=i,*p2=&ci; // 這就錯(cuò)了逝撬。n是對(duì)非常量i的引用,是int 乓土,而p2對(duì)ci的引用時(shí)const int 所以不行
5宪潮、 decltype 類型提示符

這個(gè)類型提示符類似于一個(gè)類型的提取,可以返回括號(hào)內(nèi)的表達(dá)式的返回類型帐我。比如說(shuō):

  • decltype(F()) 那么它整體就代表著F()函數(shù)的返回類型,如果是int 那么可以這么用:
decltype(F()) a=10;   //a是整形變量愧膀;
  • 另外decltype()對(duì)于引用和const都會(huì)全盤(pán)返回拦键,比如說(shuō):
const int i=10,&m=i;
decltype(m) x=i  

第二句就相當(dāng)于是 const int & x=i;也就是說(shuō)const&這兩個(gè)操作都被返回

下面是我總結(jié)的集中decltype()返回引用類型的情況

  • 指針解引用 檩淋,如 :
int i=10;
int *p=i;
decltype(*p) x=i 

第三句等效于 int &x=i芬为;返回的是引用int &而不是int

  • 本身就是一個(gè)引用,上面說(shuō)過(guò)了蟀悦;

  • 如果decltype((X))媚朦,也就是說(shuō)括號(hào)內(nèi)還有一個(gè)括號(hào)把變量包含在內(nèi),那么就是返回的這個(gè)變量加上& 日戈,比如如果X是int變量询张,那么前面返回 int &

  • 賦值語(yǔ)句會(huì)返回引用 decltype(a=b) 返回的就是a的類型的引用, 比如如果a是int變量浙炼,那么前面返回 int &

正文之后

今天之所以現(xiàn)在就出來(lái)了份氧。是因?yàn)橥砩匣緵](méi)怎么看書(shū),去寫(xiě)簡(jiǎn)書(shū)去了弯屈。所以晚上我就沒(méi)怎么看書(shū)蜗帜,現(xiàn)在十點(diǎn)半已經(jīng)快寫(xiě)完了,每天寫(xiě)寫(xiě)簡(jiǎn)書(shū)资厉,撈撈粉絲厅缺,賺點(diǎn)人氣,爽歪歪~ ~ 待會(huì)再看會(huì)《金粉世家》和《計(jì)算機(jī)學(xué)科導(dǎo)論》宴偿,這樣的日子才是我大頭張應(yīng)該過(guò)的嗎~ ~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末湘捎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窄刘,更是在濱河造成了極大的恐慌消痛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件都哭,死亡現(xiàn)場(chǎng)離奇詭異秩伞,居然都是意外死亡逞带,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)纱新,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)展氓,“玉大人,你說(shuō)我怎么就攤上這事脸爱∮龉” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵簿废,是天一觀的道長(zhǎng)空入。 經(jīng)常有香客問(wèn)我,道長(zhǎng)族檬,這世上最難降的妖魔是什么歪赢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮单料,結(jié)果婚禮上埋凯,老公的妹妹穿的比我還像新娘。我一直安慰自己扫尖,他們只是感情好白对,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著换怖,像睡著了一般甩恼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沉颂,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天媳拴,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凸丸,可吹牛的內(nèi)容都是我干的款青。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起线梗,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎怠益,沒(méi)想到半個(gè)月后仪搔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜻牢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年烤咧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了偏陪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡煮嫌,死狀恐怖笛谦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昌阿,我是刑警寧澤饥脑,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站懦冰,受9級(jí)特大地震影響灶轰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刷钢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一笋颤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闯捎,春花似錦椰弊、人聲如沸许溅。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)贤重。三九已至茬祷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間并蝗,已是汗流浹背祭犯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滚停,地道東北人沃粗。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像键畴,于是被迫代替她去往敵國(guó)和親最盅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容