正文之前
看了一天《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ò)的嗎~ ~