C++Primer學(xué)習(xí)筆記
C++中關(guān)于Const形參和實(shí)參的總結(jié),
在調(diào)用函數(shù)的時(shí)候,如果函數(shù)的形參是const的話(huà)那么這個(gè)函數(shù)可以接受非const的實(shí)參。
如果函數(shù)的實(shí)參是const的,形參是非const的,那么這個(gè)函數(shù)是不接受的
函數(shù)的調(diào)用const與非const的區(qū)別在于,我們可以用非const對(duì)象初始化const引用對(duì)象,而不能用const對(duì)象初始化非const的應(yīng)用對(duì)象,這樣不安全。
第二章:
在做基礎(chǔ)變量賦值的時(shí)候,如果const對(duì)象只能賦值給const引用對(duì)象,非const對(duì)象可以賦值給const引用對(duì)象。
1.(P54) 如果想在多個(gè)文件之間共享const對(duì)象,必須在變量的定義之前添加extern關(guān)鍵字
2.(P59)C++11新標(biāo)準(zhǔn)規(guī)定,允許將變量聲明為constexpr類(lèi)型以便由編譯器來(lái)驗(yàn)證變量的值是否是一個(gè)常量表達(dá)式。聲明為constexpr的變量一定是一個(gè)常量,而且必須用常量表達(dá)式初始化。一般來(lái)說(shuō),如果你認(rèn)定變量是一個(gè)常量表達(dá)式,那就把它聲明成constexpr類(lèi)型。
3.(p59)必須明確一點(diǎn),在constexpr聲明中如果定義了一個(gè)指針,限定符constexpr僅對(duì)指針有效,與指針?biāo)傅膶?duì)象無(wú)關(guān)。因?yàn)閏onstexpr把它說(shuō)定義的對(duì)象置為了頂層const
4.C++11新標(biāo)準(zhǔn)引入了auto類(lèi)型說(shuō)明符,用它就能讓編譯器替我們?nèi)シ治霰磉_(dá)式所屬的類(lèi)型。和原來(lái)那些只對(duì)應(yīng)一種特定類(lèi)型的說(shuō)明符不同,auto讓編譯器通過(guò)初始值來(lái)推算變量的類(lèi)型。顯然,auto定義的變量必須有初始值。
5.使用auto也能在一條語(yǔ)句中聲明多個(gè)變量,因?yàn)橐粭l聲明數(shù)據(jù)只能有一個(gè)基本數(shù)據(jù)類(lèi)型,所以該語(yǔ)句中所有變量的初始基本數(shù)據(jù)類(lèi)型必須一樣。
6.C++11新標(biāo)準(zhǔn)引入了第二種數(shù)據(jù)類(lèi)型說(shuō)明符decltype,它的作用是選擇并返回操作數(shù)的數(shù)據(jù)類(lèi)型,在此過(guò)程中,編譯器分析表達(dá)式并得到它的類(lèi)型,卻不實(shí)際計(jì)算表達(dá)式的值。
如果表達(dá)式的內(nèi)容是解引用操作,則decltype將得到引用類(lèi)型。正如我們所熟悉的那樣,解引用指針可以得到指針?biāo)傅膶?duì)象。而且還能給這個(gè)對(duì)象賦值。
7.對(duì)于decltype所用的表達(dá)式來(lái)說(shuō),如果變量名加上了一對(duì)括號(hào),則得到的類(lèi)型與不加括號(hào)時(shí)會(huì)有不同,如果decltype使用的是一個(gè)不加括號(hào)的變量,則得到的結(jié)果就是該變量的類(lèi)型;如果給變量加上一層或多層括號(hào),編譯器就會(huì)把它當(dāng)成是一個(gè)表達(dá)式,變量是一種可以作為賦值語(yǔ)句左值的特殊表達(dá)式,所以這樣的decltype就會(huì)得到引用類(lèi)型。
8.頭文件通常包含那些只能被定義一次的實(shí)體,如類(lèi),const和constexpr變量等。頭文件也經(jīng)常用到其他頭文件的功能。
9.C++程序還會(huì)用到的一項(xiàng)處理就是頭文件保護(hù),頭文件保護(hù)符依賴(lài)于預(yù)處理變量,預(yù)處理變量有兩種狀態(tài),已定義和未定義。#define指令把一個(gè)名字設(shè)定為預(yù)處理變量,另外兩個(gè)指令則分別檢查某個(gè)指定的預(yù)處理變量是否已經(jīng)定義:#ifdef,當(dāng)且僅當(dāng)變量已定義時(shí)為真,#ifndef當(dāng)且僅當(dāng)變量未定義時(shí)為真,一旦檢查結(jié)果為真,則執(zhí)行后續(xù)操作直至遇到#endif指令為止。
10.位于頭文件的代碼,一般來(lái)說(shuō)不應(yīng)該使用using聲明,這是因?yàn)轭^文件的內(nèi)容會(huì)拷貝到所有引用它的文件中去,如果頭文件里有某個(gè)using聲明,那么每個(gè)使用了該頭文件的文件都會(huì)有這個(gè)聲明。對(duì)于某些程序來(lái)說(shuō),由于不經(jīng)意間包含了一些名字,反而可能產(chǎn)生始料未及的名字沖突。
11.凡是使用了迭代器的循環(huán)體,都不要向迭代器所屬的容器添加元素。
12.閉包:函數(shù)是有狀態(tài)的。相同的函數(shù)可以有不同的狀態(tài).通過(guò)函數(shù)生成函數(shù)。生成的這些函數(shù)包含上下文,狀態(tài)。
13.string的實(shí)現(xiàn)機(jī)制:
1.在存儲(chǔ)上,string也是用數(shù)組來(lái)存儲(chǔ)。
2.既然是一個(gè)數(shù)組,這個(gè)就有一個(gè)大小,capacity就是這個(gè)數(shù)組的大??;
3.如果string=hello,至少需要6個(gè)字節(jié),但是在string實(shí)現(xiàn)的時(shí)候,一般會(huì)多分配一個(gè)空間,用于字符串的拼接;
4,capcity有可能是20,會(huì)多分配一些內(nèi)容,用于string內(nèi)容的擴(kuò)展;
5,如果拼接后的字符串長(zhǎng)度超過(guò)capacity,那么就需要繼續(xù)分配空間,最大就是max_size
14.函數(shù)的形參列表可以為空,但是不能省略,要想定義一個(gè)不帶形參的函數(shù),最常用的辦法是書(shū)寫(xiě)一個(gè)空的形參列表。不過(guò)為了與C語(yǔ)言兼容,也可以使用關(guān)鍵字void表示函數(shù)沒(méi)有形參。
15.局部靜態(tài)對(duì)象在程序的執(zhí)行路徑第一次經(jīng)過(guò)對(duì)象定義語(yǔ)句時(shí)初始化,并且直到程序終止才被銷(xiāo)毀,在此期間即使對(duì)象所在的函數(shù)結(jié)束執(zhí)行也不會(huì)對(duì)它有影響。
16.如果我們傳遞的形參是一個(gè)數(shù)組,則實(shí)參自動(dòng)的轉(zhuǎn)換成指向數(shù)組首元素的指針,數(shù)組的大小對(duì)函數(shù)的調(diào)用沒(méi)有影響。
17.(P202)函數(shù)的調(diào)用,返回局部對(duì)象的引用是錯(cuò)誤的;同樣,返回局部對(duì)象的指針也是錯(cuò)誤的,一旦函數(shù)完成,局部對(duì)象被釋放,指針將指向一個(gè)不存在的對(duì)象。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。