c++ primer study note.doc_第1頁(yè)
c++ primer study note.doc_第2頁(yè)
c++ primer study note.doc_第3頁(yè)
c++ primer study note.doc_第4頁(yè)
c++ primer study note.doc_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余15頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

M*a*i*l*l*o*v*e.*c*n1)2) 關(guān)于文件格式標(biāo)準(zhǔn)c+頭文件是沒(méi)有后綴名的,原因是不同的實(shí)現(xiàn)產(chǎn)品的頭文件格式不一致.c格式的是c程序的文件,但在unix中卻被當(dāng)作是c+程序的文件.Include 一般引用工程文件和標(biāo)準(zhǔn)頭文件,可以更改系統(tǒng)設(shè)置的默認(rèn)路徑;”一般引用自定義頭文件,會(huì)從當(dāng)前目錄下開(kāi)始找。3) 并不是所有c+實(shí)現(xiàn)都支持命名空間,所以在不支持的里面用using是會(huì)報(bào)錯(cuò)的.4) 無(wú)論是一種語(yǔ)言還是它的標(biāo)準(zhǔn)庫(kù)都不可能提供實(shí)際程序設(shè)計(jì)環(huán)境要求的所有數(shù)據(jù)類型。因此現(xiàn)代語(yǔ)言都提供了類型定義工具設(shè)施使我們能夠在語(yǔ)言中引入新的類型這些類型的用法與內(nèi)置類型的用法一樣方便在C+中這種設(shè)施就是類機(jī)制。5) #ifndef 沒(méi)有定義,#ifdef如果定義了,前者用于避免重復(fù)包含宏.6) 在編譯標(biāo)準(zhǔn)c+的時(shí)候會(huì)自動(dòng)定義_CPLUSPLUS,而編譯c的時(shí)候會(huì)自動(dòng)定義_STDC_7) 預(yù)定義名字,_LINE_記錄文件已經(jīng)被編譯的行數(shù),_FILE_記錄正在被編譯的文件的名字._TIME_ 編譯文件的時(shí)間;_DATE_編譯文件的日期.8) 斷言assert()定義在c語(yǔ)言中的頭文件,在c+中是cassert.9) c+一等公民(first class ) 包括整型等但不包括數(shù)組類型10) 指針的類型都是整形,因?yàn)榇娣诺闹凳莾?nèi)存地址。而指針指向的類型可以是多種類型。11) 用指針來(lái)間接操作變量并沒(méi)有什么好處,比直接操作變量名字的效率低而且容易錯(cuò).指針的作用應(yīng)該是管理和操縱動(dòng)態(tài)分配的內(nèi)存.12) 靜態(tài)與動(dòng)態(tài)內(nèi)存分配,靜態(tài)對(duì)象是有名字的變量,動(dòng)態(tài)對(duì)象是沒(méi)有名字的變量,只能通過(guò)指針操作.靜態(tài)對(duì)象的分配與釋放有編譯器自動(dòng)完成。動(dòng)態(tài)對(duì)象必須通過(guò)new和delete表達(dá)式顯示管理。13) 內(nèi)存泄漏(memory leak)是指一塊動(dòng)態(tài)分配的內(nèi)存,而擁有這塊內(nèi)存的指針已經(jīng)丟失。沒(méi)有辦法繼續(xù)使用這塊內(nèi)存。14) c+不允許成員函數(shù)和數(shù)據(jù)成員共享同一個(gè)名字.15) 內(nèi)聯(lián)函數(shù)inline function,內(nèi)聯(lián)函數(shù)不會(huì)引入任何函數(shù)調(diào)用。避免了調(diào)用函數(shù)比直接訪問(wèn)內(nèi)存開(kāi)銷更大的類結(jié)構(gòu)設(shè)置。在類中定義的成員函數(shù)會(huì)被自動(dòng)當(dāng)成是內(nèi)聯(lián)函數(shù)。既編譯的時(shí)候會(huì)被擴(kuò)展成直接訪問(wèn)字段。16) 函數(shù)重載function overloading,函數(shù)重載允許2個(gè)或以上的函數(shù)使用同一個(gè)名字,但是他們的參數(shù)表必須不同:參數(shù)類型不同,或參數(shù)數(shù)目不同。17) 靜態(tài)成員,無(wú)論類的對(duì)象被定義了多少個(gè),靜態(tài)成員在對(duì)象中只有一個(gè)。這個(gè)是類的所以對(duì)象成員之間共享數(shù)據(jù)的一種方式.18) 域操作符class scope operator 雙冒號(hào)??梢栽陬惖耐獠慷x一個(gè)成員函數(shù)屬于它。19) 虛擬函數(shù)的調(diào)用要等到運(yùn)行時(shí)刻,系統(tǒng)根據(jù)被調(diào)用對(duì)象的類型來(lái)決定選擇虛擬函數(shù)的那一個(gè)實(shí)例。20) 虛擬函數(shù)比非虛擬函數(shù)的效率要低一些6因?yàn)樗鼈儾荒鼙粌?nèi)聯(lián)內(nèi)聯(lián)發(fā)生在編譯時(shí)刻而虛擬函數(shù)是在運(yùn)行時(shí)刻被處理的所以它們可能是運(yùn)行時(shí)刻效率低下的原因之一。21) 類模板中的成員函數(shù)是在需要的時(shí)候才被實(shí)例化對(duì)應(yīng)的類型的。22) 當(dāng)訪問(wèn)名字空間下的方法的時(shí)候也會(huì)使用雙冒號(hào) MyNameSpace:MyClass,這個(gè)和類的外部方法符號(hào)一致的。23) namespace shortname=long_name_space_name使用簡(jiǎn)短名字或者使用using namespace name. 24) using namespace name:class可以使name名字空間僅僅class可見(jiàn)25) 字符串可以換行顯示 在一行的末尾加上 反斜杠既可.26) 變量的rvalue右值存放的是read值,lvalue左值存放的是location值即是變量的內(nèi)存地址值。27) 變量的定義會(huì)引起內(nèi)存分配,一個(gè)對(duì)象分配后只能有一個(gè)去訪問(wèn)它的地址值,所以一個(gè)變量只能定義一次.28) 對(duì)象聲明extern說(shuō)明該對(duì)象在外部存在定義,這里是提供其類型說(shuō)明,并不分配內(nèi)存.可以一處定義多處聲明,聲明常放在頭文件中,需要的時(shí)候被引用。也便于修改。29) 變量應(yīng)該由3個(gè)值組成。變量的標(biāo)識(shí)符:變量名字;變量的左值:內(nèi)存地址值;變量的右值:存放的值.30) 命名規(guī)則:對(duì)象名一般用小寫字母;31) 全局變量會(huì)自動(dòng)給變量初始值,局部變量或new表達(dá)式生成的對(duì)象是未初始化的,他們的值是未定義的。32) 被聲明了初始值的對(duì)象稱做已經(jīng)初始化的。33) 兩個(gè)類型不同的指針禁止相互賦值,因?yàn)闀?huì)引起編譯器的解釋困難。34) 空類型指針 void *可以接受除函數(shù)指針以外的其它數(shù)據(jù)類型的指針的賦值。35) 指針pr表示存儲(chǔ)的對(duì)象的內(nèi)存地址值,&pr表示的當(dāng)前指針pr的內(nèi)存地址值.36) 指針的加減法取決于指針的類型,類型決定了地址移動(dòng)的單位長(zhǎng)度.由于變量可能不是連續(xù)分配的,所以除了數(shù)組以外最好不要這么使用。37) c+提供2種類型的字符串,c保留下來(lái)的風(fēng)格以及c+自己實(shí)現(xiàn)的string類.38) c風(fēng)格的字符串在指針指向0和字符串為空串的時(shí)候長(zhǎng)度都為0.39) Const變量必須在定義的時(shí)候初始化,const指針指向的對(duì)象不論是否是const變量都不能修改值。40) 引用由類型標(biāo)識(shí)符加取地址符號(hào)組成,必須在定義的時(shí)候初始化,引用的對(duì)象一旦指定就不能再修改。指針類型不能直接賦值常量,引用類型只有在常變量類型的情況下才能賦值常量/ 僅對(duì)于const 引用才是合法的const int &ir = 1024;const int &ir2 = dval;.const double &dr = dval + 1.0;41) 引用對(duì)象之間的賦值修改的是引用指向的對(duì)象的值,而引用仍然指向原來(lái)的對(duì)象不會(huì)被修改。42) 指針不能指向引用43) 數(shù)組初始化的時(shí)候 長(zhǎng)度必須確定 也不能是0 數(shù)組的長(zhǎng)度要比字符串的長(zhǎng)度多1個(gè) 因?yàn)槟┪矔?huì)有0占位.44) 枚舉不僅定義了一個(gè)整數(shù)常量,還構(gòu)成了一個(gè)集合。45) 如果變量不是常變量 即使賦值了也不能作為數(shù)組的維數(shù).46) 數(shù)組不能被另外一個(gè)數(shù)組初始化,也不能賦值給另外個(gè)數(shù)組。另外c+不允許聲明引用數(shù)組.47) C+中的vector ,complex, pair都支持泛型.48) C+ 內(nèi)部定義的函數(shù)自動(dòng)被聲明成內(nèi)聯(lián)函數(shù),但是在類外部實(shí)現(xiàn)的函數(shù)必須顯示聲明生內(nèi)聯(lián)函數(shù)。49) 在類體外定義/的內(nèi)聯(lián)成員函數(shù)應(yīng)該被包含在含有該類定義的頭文件中。50) 指針在解引用之前,需要判斷下指針地址是否為0,否則報(bào)內(nèi)存出錯(cuò)。51) 在邏輯與表達(dá)式中,只要第一個(gè)表達(dá)式的值為false,就不會(huì)計(jì)算第2個(gè)。在邏輯或表達(dá)式中,只要第一個(gè)表達(dá)式的值為true,就不會(huì)計(jì)算第2個(gè)。52) c/c+不保證從左到由的順序,所以要注意運(yùn)算順序。53) c+ 棧 是后進(jìn)先出 順序放置數(shù)據(jù) 54) sizeof表達(dá)式在編譯時(shí)刻計(jì)算,所以可以被看作常量表達(dá)式。55) 運(yùn)行時(shí)刻的內(nèi)存分配叫動(dòng)態(tài)內(nèi)存分配。56) 程序的空閑存儲(chǔ)區(qū)叫堆heap.棧叫做stack.,棧是后進(jìn)先出。57) 位操作符: 按位非:取反操作 1-0,0-1移位操作右移操作符 左邊補(bǔ)0按位與& 有0就為0按位或| 有1就為1按位異或 1出現(xiàn)且1次 為1 其它的全部為058) c+ 整形值前面有個(gè)0表示八進(jìn)制 0x表示十六進(jìn)制59) 賦值操作符= 是右結(jié)合的 即使最先計(jì)算右邊的。算術(shù)運(yùn)算符是左結(jié)合的,左線計(jì)算左邊的。60) 混合類型的算術(shù)表達(dá)式,最寬的類型為目標(biāo)轉(zhuǎn)換類型。61) Void*指針,常被叫做泛型指針。任何非const類型的指針都可以賦值給void*型的指針。指向?qū)ο箢愋臀炊ɑ蛘邔?duì)象類型可能發(fā)生變化的情況。Void*類型的指針再解引用之前必須進(jìn)行類型轉(zhuǎn)換,因?yàn)閮H僅從void編譯器無(wú)法知道對(duì)象的類型,從而無(wú)法計(jì)算對(duì)象的值。Void*指針賦值給其它指針的時(shí)候必須進(jìn)行強(qiáng)制轉(zhuǎn)換。62) Volatile 編譯不會(huì)對(duì)改成員變量進(jìn)行優(yōu)化。63) Const_cast() 取消掉變量的常量性,static_cast用于將不確定的類型轉(zhuǎn)換成確定的類型,具有較大的風(fēng)險(xiǎn)性,一般都需要進(jìn)行檢查。Reinterpret_cast()底層位操作轉(zhuǎn)換。Danymic_cast支持在運(yùn)行時(shí)刻來(lái)判斷對(duì)象的類型。64) 程序語(yǔ)句中最簡(jiǎn)單的語(yǔ)句是空語(yǔ)句,由一個(gè)分號(hào)構(gòu)成.65) Switch case分支語(yǔ)句,case某個(gè)分支可以有多條語(yǔ)句。但是如果有聲明對(duì)象或變量的話必須加花括號(hào)把整個(gè)case分支包含起來(lái)。66) For循環(huán)可以應(yīng)用在外部定義的變量,從而把初始化語(yǔ)句省略,只保留;號(hào)67) 標(biāo)準(zhǔn)c+之前的for循環(huán)的括號(hào)內(nèi)的定義變量可以擴(kuò)展外部。68) Do while 循環(huán)中,while不支持變量的定義和聲明。69) Break只能放在循環(huán)語(yǔ)句和switch分值語(yǔ)句中,放在if語(yǔ)句中要報(bào)錯(cuò)。退出的時(shí)候是退出最近的那一層的for,while ,do while,switch循環(huán)或分支。70) Continue只能出現(xiàn)在循環(huán)語(yǔ)句中。71) Goto lablel, label 以:結(jié)束,如果右邊緊挨右花括弧,需要加句空語(yǔ)句,即使加個(gè);即可。Goto不能跳過(guò)有聲明的語(yǔ)句,除非該語(yǔ)句被放在語(yǔ)句快中。盡量不用goto語(yǔ)句。72) 終止程序的辦法。#include,abort();函數(shù)。 #include assert( 條件 );還有就是拋出異常。73) 鏈表中的元素不是順序放在內(nèi)存中的,所以對(duì)+指針不能找到下一個(gè)值。74) 抽象容器。順序容器list,vector,deque(雙端隊(duì)列),由單一元素組成的順序集合。關(guān)聯(lián)容器,可以查詢一個(gè)元素是否存在,并且可以有效的提取。如set,map.multimap.75) 容量是指下一次需要增長(zhǎng)自己之前能夠被加入到容器中的元素的總數(shù)。只指順序容器,且不包括list.76) Vector適合小類型的數(shù)據(jù)使用,list適合復(fù)雜類型的使用。Vector的reserve()操作是調(diào)整容量,但是對(duì)于小類型的數(shù)據(jù)反而會(huì)變的更慢。大類型的數(shù)據(jù)效果會(huì)更好。List和set,map容器不支持排序?77) 如果容器的操作主要是在前段插入元素,應(yīng)該選擇deque而不是vector.78) 迭代器提供了一種一般化的方法,對(duì)關(guān)聯(lián)容器或順序容器的每個(gè)元素就行連續(xù)訪問(wèn)。79) Vector和deque在內(nèi)存中是連續(xù)的,而list在內(nèi)存中不是連續(xù)的。80) string函數(shù) find(),find_first_of(),substr(),rfind(),find_first_not_of(),find_last_Of(), find_last_not_of(),erase(),assign(),append()81) vector a(“fdasfda”)為什么是錯(cuò)的 82) 當(dāng)我們只想知道一個(gè)值是否存在時(shí)set 最有用處希望存儲(chǔ)也可能修改一個(gè)相 關(guān)的值時(shí)map 最為有用.map has a alias name associative array.83) 有許多編譯器不支持對(duì)vector,set,map等聲明時(shí)的缺省參數(shù),所以要手動(dòng)加入allocator.默認(rèn)情況下,關(guān)聯(lián)容器用小于關(guān)系符排序。84) Map的count和find可以查找一個(gè)鍵值是否存在。關(guān)聯(lián)容器不支持預(yù)定義的分配長(zhǎng)度。必須插入而不是賦值。85) Multimap支持一個(gè)鍵多個(gè)項(xiàng),但是multimap不支持下標(biāo)操作符。86) 函數(shù)定義的地方參數(shù)叫做形式參數(shù),當(dāng)實(shí)際調(diào)用函數(shù)傳遞的參數(shù)叫實(shí)際參數(shù)。函數(shù)類型和內(nèi)置數(shù)組類型不能作為函數(shù)的返回類型。標(biāo)準(zhǔn)c+中函數(shù)返回類型不能省略,以前的會(huì)默認(rèn)當(dāng)成int的返回類型。87) 引用指向了對(duì)象后就不能在去給引用變量賦值其它變量的名字,但是可以該量引用變量引用的對(duì)象的值。88) 為了支持class類型,尤其是有效直觀的實(shí)現(xiàn)重載操作符機(jī)制,c+特別引入了引用類型.89) C+中的數(shù)組永遠(yuǎn)不會(huì)按值傳遞,參數(shù)默認(rèn)的是數(shù)組的第0個(gè)值的指針,所以不會(huì)對(duì)數(shù)組的長(zhǎng)度進(jìn)程檢查。當(dāng)不想改變到數(shù)組的值,可以加const進(jìn)行修飾.c風(fēng)格的字符串是字符的數(shù)組,最后一個(gè)是0.90) 指向數(shù)組類型的指針變量,在取值的時(shí)候可以通過(guò)解引用和使用訪問(wèn)器來(lái)進(jìn)行訪問(wèn)值。使用訪問(wèn)器的時(shí)候不需要再解引用。91) 函數(shù)調(diào)用的實(shí)參按位置解析,缺省參數(shù)只能用來(lái)替換函數(shù)調(diào)用缺少的尾部實(shí)參。函數(shù)申明可以全部或部分指定缺省參數(shù)實(shí)參。但是記住,在左邊參數(shù)的任何缺省參數(shù)被提供之前,最右邊的未初始化參數(shù)(在其他地方初始化的可以不提供了)必須提供缺省參數(shù)值。一參數(shù)只能在一個(gè)文件中被指定一次缺省參數(shù)。92) Inline函數(shù)必須同調(diào)用它的函數(shù)在同一個(gè)文本中出現(xiàn)。Inline函數(shù)對(duì)編譯器來(lái)說(shuō)只是個(gè)建議,可能會(huì)被忽略,因?yàn)橛械臅r(shí)候不適合展開(kāi)函數(shù)。93) 鏈接指示符用于申明其它語(yǔ)言寫的函數(shù),不能在函數(shù)內(nèi)部聲明。復(fù)合申明即申明多個(gè)函數(shù)可以在外部加好括號(hào),當(dāng)放include的時(shí)候是將該文件的所有函數(shù)申明了。94) 函數(shù)指針與指針函數(shù)。函數(shù)的類型只決定于返回值類型與參數(shù)表。函數(shù)的類型決定了指針類型的不一致。當(dāng)一個(gè)函數(shù)沒(méi)有調(diào)用操作符類型的時(shí)候,會(huì)被解釋成指向該類型的函數(shù)指針。函數(shù)指針賦值為0的時(shí)候,表示不指向任何指針。函數(shù)指針調(diào)用前確保已經(jīng)被初始化或賦值,切不指向0.95) 函數(shù)指針數(shù)組,每個(gè)數(shù)組的元素都是一個(gè)指向函數(shù)的函數(shù)指針。96) 注意到,多維數(shù)組的指針表達(dá)方式和通過(guò)typedef定義的指向函數(shù)的指針數(shù)組定義方式很像。97) 函數(shù)指針定義的時(shí)候,返回的類型是對(duì)應(yīng)的前面的符號(hào)的類型,如int (*function) ( int parameter).而返回指針函數(shù)的定義如下:int(*function(int a)(int parameter).這種形式的算不算是指針函數(shù)?98) 函數(shù)參數(shù)的類型不能是函數(shù)類型,函數(shù)類型的將會(huì)杯轉(zhuǎn)換成對(duì)應(yīng)的函數(shù)指針類型。函數(shù)指針可以用作參數(shù)和返回類型。函數(shù)不能返回函數(shù)類型,可以返回指向它的函數(shù)指針。函數(shù)指針調(diào)用時(shí),可以直接想調(diào)用函數(shù)一樣輸入名字再加參數(shù),或者先加括號(hào)解除引用再調(diào)用。99) 指向c+的函數(shù)指針和指向c的函數(shù)指針類型不一樣.不能相互賦值。當(dāng)然部分編譯器已經(jīng)把這個(gè)作為一種擴(kuò)展而不加限制。100) 鏈接指示符extern “”當(dāng)聲明一個(gè)函數(shù)時(shí),這個(gè)函數(shù)的參數(shù)也會(huì)被當(dāng)作鏈接指示的類型的函數(shù)。101) c+中有三種域,類域、命名空間域、局部域。If語(yǔ)句在條件中定義的變量可以在其分支語(yǔ)句中有效。102) 全局域內(nèi)引入的變量叫全局變量,全局變量是一個(gè)運(yùn)行時(shí)刻實(shí)體,生命期從程序開(kāi)始始,程序結(jié)束終。103) 函數(shù)聲明指定了函數(shù)的名字、返回類型及其參數(shù)表。函數(shù)定義除了函數(shù)聲明還包括函數(shù)體。104) 對(duì)象的聲明即使定義的表達(dá)式,但是定義只能出現(xiàn)一次,所以加上了extern關(guān)鍵字,既是不會(huì)分配內(nèi)存。但是記得不能賦值。否則仍然被看成是定義。105) 類型安全鏈接是用于檢查在聲明時(shí)候函數(shù)的參數(shù)不一致的情況。106) 符號(hào)常量和inline函數(shù)可以被定義多次,所以可以放在頭文件里面。107) 建議把那些天生無(wú)法內(nèi)聯(lián)的函數(shù)不聲明為inline,并且不放在頭文件中。108) C+中的local object分3種,automatic object(自動(dòng)對(duì)象),register object(寄存器對(duì)象),local static object(局部靜態(tài)對(duì)象)。自動(dòng)對(duì)象隨函數(shù)的調(diào)用而分配內(nèi)存在棧上,隨函數(shù)的結(jié)束而結(jié)束,它的任何值都被丟掉。所以它的地址不應(yīng)該作為函數(shù)的返回值,因?yàn)槭且粋€(gè)無(wú)效無(wú)值的存儲(chǔ)區(qū)。109) 空懸指針(dangling pointer),存放有生命期長(zhǎng)于它的自動(dòng)變量的地址的指針。110) 在函數(shù)中被頻繁使用的自動(dòng)變量可以使用register關(guān)鍵字。有的編譯器會(huì)把它加載到記起的寄存器中。但這個(gè)對(duì)編譯器來(lái)說(shuō)只是個(gè)建議。111) 未初始化的局部靜態(tài)對(duì)象會(huì)初始化為0,自動(dòng)對(duì)象的值可能回事任意值,除非它被顯示初始化。112) 動(dòng)態(tài)分配的對(duì)象.dynamically allocated object,動(dòng)態(tài)分配的對(duì)象被分配在程序的空閑存儲(chǔ)區(qū)里面,分配的數(shù)組長(zhǎng)度可以在運(yùn)行時(shí)刻計(jì)算。113) 再對(duì)指針delete之前沒(méi)有必要進(jìn)行測(cè)試是否指針的值為0,因?yàn)橄到y(tǒng)默認(rèn)delete操作就自動(dòng)測(cè)試。Delete對(duì)象之后,最好把指針設(shè)為0,避免讓指針變成空懸指針。Delete操作只能應(yīng)用在用new表達(dá)式生成的對(duì)象上。114) 動(dòng)態(tài)分配容易照成的3種錯(cuò)誤。1.delete表達(dá)式失敗,內(nèi)存無(wú)法返回,照成內(nèi)存泄漏;2.多個(gè)指針引用到同一個(gè)地址,不同指針執(zhí)行了不同的操作。3.delete指針的對(duì)象沒(méi)有被置為0,然后繼續(xù)讀寫指針指向的對(duì)象。115) Auto_ptr可以幫助程序員自動(dòng)管理用new動(dòng)態(tài)分配的單個(gè)對(duì)象,不支持?jǐn)?shù)組,auto_ptr指針生命期結(jié)束的時(shí)候,對(duì)象被自動(dòng)釋放。Get()用于判斷值auto_ptr指針值是否為0.在auto_ptr被定義之后,不能直接賦值,只能通過(guò)reset(new表達(dá)式)來(lái)完成。Auto_Ptr在指向新值之前會(huì)刪除以前的變量。用assign(“值”)可以不刪除原來(lái)的對(duì)象,僅僅是修改它的值。Release()是取的指針的地址值,并且刪除以前的那個(gè)指針。保證始終只有一個(gè)auto_ptr指向一個(gè)對(duì)象。116) Auto_ptr的get()和release()區(qū)別。前者,把指針地址賦值給其它變量,并不交出控制權(quán),后者要交出控制權(quán)。在做delete操作的時(shí)候,對(duì)于前者要作用在它本身,后面要作用在被賦值的新的指針對(duì)象上。117) 空閑內(nèi)存區(qū)動(dòng)態(tài)分配的數(shù)組必須在for循環(huán)中初始化。因?yàn)榇蠖鄶?shù)處理C 風(fēng)格字符串?dāng)?shù)組的例程都要遍歷數(shù)組直到結(jié)尾空字符缺少該空字符常常導(dǎo)致嚴(yán)重的程序錯(cuò)誤因?yàn)槌绦驎?huì)讀寫到其他不該讀寫的內(nèi)存我們建議使用C+標(biāo)準(zhǔn)庫(kù)string 這正是避免此類錯(cuò)誤的一個(gè)原因.118) 對(duì)于由new表達(dá)式分配的內(nèi)存,只有第一維可以是運(yùn)行時(shí)刻的常量,其它維必須是在編譯時(shí)刻已知的常量值。119) 當(dāng)在函數(shù)內(nèi)部要訪問(wèn)外部的同名參數(shù)時(shí)候,可以使用:變量名 的方式得到。120) 成員的定義必須在其聲明所在的名字空間和其外圍名字空間定義。121) 在某個(gè)文件中使用沒(méi)有命名的名字空間,可以使該名字空間的函數(shù)僅僅在這個(gè)文件內(nèi)部可見(jiàn)。使用這個(gè)函數(shù)的時(shí)候,直接調(diào)用名字即可。C中實(shí)現(xiàn)這個(gè)辦法是將變量定義成靜態(tài)的,這樣在其它文件中就不可見(jiàn)。122) Namespace short_name=ture_long_name可以使用shortname來(lái)代替長(zhǎng)的名字空間。Using 名字空間:函數(shù) 可以部分引用名字空間的內(nèi)容。Using namespace 名字 引入整個(gè)名字空間。由using引起的二義性錯(cuò)誤是在該名字被使用時(shí)才被檢測(cè)到的。Using引入的變量會(huì)被看成是一種全局聲明,所以局部變量可以隱藏using引入的變量。由多個(gè)using 指示符引起的二義性錯(cuò)誤只能在使用點(diǎn)上被檢測(cè)到。123) 只有參數(shù)和返回類型都不同才叫做函數(shù)的重載,反之2個(gè)都不同的時(shí)候會(huì)被看成是函數(shù)的重復(fù)聲明。只有缺省實(shí)參不同也會(huì)被看成是函數(shù)的重復(fù)聲明。當(dāng)函數(shù)的參數(shù)是按值傳遞的時(shí)候,參數(shù)前有const或volatile都被看成是同一個(gè)函數(shù)或聲明。當(dāng)是按指針或引用傳遞的時(shí)候就會(huì)被看成是不同的函數(shù)。124) 重載函數(shù)的聲明都必須在同一個(gè)域中,一個(gè)聲明為局部的函數(shù)將隱藏而不是重載一個(gè)全劇域中聲明的函數(shù)。不同名字空間,不同類的成員函數(shù)都不可以重載。但是通過(guò)using指示符,可以將不同名字空間的函數(shù)在當(dāng)前引入域進(jìn)行函數(shù)重載。125) Using聲明和using 指示符。前者是引入名字空間的字段或函數(shù),后者是引入整個(gè)名字空間。126) 鏈接指示符只能指定重載函數(shù)中的一個(gè)函數(shù),因?yàn)榫幾g器沒(méi)有辦法對(duì)這種外部函數(shù)進(jìn)行特殊編碼,函數(shù)調(diào)用的時(shí)候會(huì)存在多個(gè)名字的函數(shù)而導(dǎo)致編譯鏈接不能保證正確安全進(jìn)行。兩個(gè)函數(shù)指針類型之間不能進(jìn)行類型轉(zhuǎn)換。127) 函數(shù)重載解析是把函數(shù)調(diào)用與重載函數(shù)集合中的一個(gè)函數(shù)相關(guān)聯(lián)的過(guò)程。候選函數(shù)-可行函數(shù)-最佳可行函數(shù)。最佳可行函數(shù)選擇過(guò)程中有個(gè)優(yōu)先級(jí)的規(guī)則。精確匹配好于提升轉(zhuǎn)換,提升轉(zhuǎn)換好于標(biāo)準(zhǔn)轉(zhuǎn)換,標(biāo)準(zhǔn)轉(zhuǎn)換好于用戶自定義轉(zhuǎn)換。128) 從一個(gè)左值表達(dá)式中抽取值的過(guò)程就叫做左值向右值的轉(zhuǎn)換。左值轉(zhuǎn)右值算是精確匹配。129) 所有的標(biāo)準(zhǔn)轉(zhuǎn)換都被視為是等價(jià)的。所以當(dāng)有2個(gè)函數(shù)要求匹配他們的參數(shù)的時(shí)候,就會(huì)產(chǎn)生二義性,編譯器將標(biāo)記為錯(cuò)誤。130) 枚舉不能作為int*空指針的轉(zhuǎn)換,即使枚舉值為0。131) 當(dāng)引用作為實(shí)參類型的時(shí)候,傳遞的是左值,類型是引用的對(duì)象的類型。132) 函數(shù)的形參是引用類型,這個(gè)類型不同于實(shí)參的類型,而實(shí)參不是引用類型的時(shí)候就會(huì)報(bào)錯(cuò)。因?yàn)轭愋娃D(zhuǎn)換產(chǎn)生的是一個(gè)臨時(shí)值,而臨時(shí)值不能const類型的,所以不能初始化該引用。133) 臨時(shí)值不能初始化非const類型的引用。如果引用前面加了const就可以了。134) 簡(jiǎn)而言之對(duì)于引用參數(shù)來(lái)說(shuō)如果實(shí)參是該引用的有效初始值則該實(shí)參是精確匹配如果該實(shí)參不是引用的有效初始值則不匹配。135) 函數(shù)重載解析:136) 候選函數(shù):1函數(shù)的聲明在候選點(diǎn)上可見(jiàn);2函數(shù)實(shí)參的類型是在一個(gè)名字空間被聲明的,則該名字空間中與被調(diào)用函數(shù)同名的函數(shù)也被加入到候選函數(shù)中來(lái)。3.嵌套域中的聲明函數(shù)隱藏而不是重載了外圍域中的函數(shù),這個(gè)時(shí)候調(diào)用點(diǎn)上選擇的是嵌套域中的函數(shù)。4.使用using聲明的時(shí)候,會(huì)覆蓋掉全局域中的同名函數(shù),減少可選函數(shù)。但使用using指示符的時(shí)候,不論是放在函數(shù)內(nèi)部還是全局域中都不會(huì)覆蓋同名函數(shù)。137) 可選函數(shù):可行函數(shù)是這樣的函數(shù)對(duì)于每個(gè)實(shí)參都存在到函數(shù)參數(shù)表中相應(yīng)的參數(shù)類型之間的轉(zhuǎn)換。138) 在函數(shù)模板內(nèi)部定義聲明中的對(duì)象或類型不能與模板參數(shù)同名。全局變量名會(huì)被同名的模板參數(shù)覆蓋。139) 模板函數(shù)當(dāng)有多個(gè)參數(shù)的時(shí)候,關(guān)鍵字class或typename不能省略。140) 函數(shù)模板也可以聲明為inline或extern 但必須放在template標(biāo)簽之后。141) 模板實(shí)參推演,由函數(shù)實(shí)參的類型來(lái)決定模板實(shí)參的類型和值的過(guò)程。142) 模板函數(shù)在調(diào)用的時(shí)候可以通過(guò)顯示指定類型或通過(guò)判斷實(shí)參類型來(lái)實(shí)例化。143) 由于編譯器的強(qiáng)悍功能,所以盡可能的不要用顯示模板實(shí)參。144) 我們通過(guò)在模板定義中的關(guān)鍵字template 之前加上關(guān)鍵字export 來(lái)聲明一個(gè)可導(dǎo)出的函數(shù)模板當(dāng)函數(shù)模板被導(dǎo)出時(shí)我們就可以在任意程序文本文件中使用模板的實(shí)例而我們所需要做的就是在使用之前聲明該模板,比如引入其聲明頭文件。有的編譯器可能不需要這樣,但是標(biāo)準(zhǔn)c+要求這樣去做。145) C+模板編譯模式包含2種,包含模式和分離編譯模式。包含模式就是模板函數(shù)的聲明即是定義在一個(gè)頭文件中。而分離編譯模式聲明在一個(gè)頭文件中,實(shí)現(xiàn)在另外一個(gè)文本中,用關(guān)鍵字export來(lái)標(biāo)明并實(shí)現(xiàn)。146) 在顯示實(shí)例化聲明中,函數(shù)模板的定義必須被給出。如果該定義不可見(jiàn),則該顯示實(shí)例化聲明是錯(cuò)誤的。147) 模板顯示特化定義是指為函數(shù)模板實(shí)例化提供特別的定義。其實(shí)就是在函數(shù)模板實(shí)例化的情況下在前面加上template。148) 函數(shù)模板顯示特化的作用?與普通函數(shù)的區(qū)別,理論上沒(méi)有區(qū)別,但是模板的特化是非常有用的。它是一個(gè)在編譯期的條件判斷。當(dāng)編譯器在編譯時(shí)找到了符合的特化實(shí)現(xiàn),就會(huì)使用這個(gè)特化實(shí)現(xiàn)。這就叫編譯器多態(tài)(或者叫靜態(tài)多態(tài))。這種東西對(duì)編寫基礎(chǔ)庫(kù)是很有用的。這也就是為何c+的基礎(chǔ)庫(kù)大量使用了模板技術(shù),而且大量使用了特化,特別是偏特化。特化主要用于類模板,由于一個(gè)類模板上擁有或多或少的函數(shù)模板,這些模板不一定符合特殊場(chǎng)合的使用,這使用用全局特化或者偏特化的方式可以修改一點(diǎn)地方而不需要重寫這個(gè)類,有些資料也顯示普通函數(shù)的重載采用的最優(yōu)匹配方式比特化要來(lái)得完美,性能也高一點(diǎn),但是在類模板上可以大大的提高擴(kuò)展特性,現(xiàn)在許多庫(kù)就是通過(guò)這種方式適應(yīng)不同場(chǎng)合的使用的。其實(shí)感覺(jué)就是直接調(diào)用函數(shù)時(shí)候,編譯器很難根據(jù)實(shí)參去實(shí)例化模板函數(shù)。所以手動(dòng)來(lái)特化有利于編譯器編譯的速度。有了顯示特化,函數(shù)模板不會(huì)在生成函數(shù)模板實(shí)例。149) 注意在選擇候選函數(shù)的時(shí)候,首先是對(duì)模板函數(shù)進(jìn)行實(shí)參推演。如果沒(méi)有合適的候選函數(shù),即使有特化的函數(shù)模板的實(shí)例適合也不能進(jìn)入候選函數(shù)。150) 實(shí)現(xiàn)了模板函數(shù),往往還要加入一個(gè)它的實(shí)例化的普通函數(shù)。因?yàn)楫?dāng)有的函數(shù)的實(shí)參在調(diào)用的時(shí)候,由于模板函數(shù)實(shí)參推演失敗會(huì)導(dǎo)致沒(méi)有候選函數(shù),這個(gè)時(shí)候普通函數(shù)卻可以通過(guò)標(biāo)準(zhǔn)轉(zhuǎn)換等來(lái)完成。即保證了一定有候選函數(shù)。151) 函數(shù)模板中的子函數(shù)調(diào)用的時(shí)候。如果與模板參數(shù)無(wú)關(guān),則名字解析是在函數(shù)模板定義的時(shí)候解析的。如果是有關(guān)的話,則是在函數(shù)模板實(shí)例化的時(shí)候解析的。152) 當(dāng)一個(gè)函數(shù)被聲明成為friend。他就可以引用類的私有數(shù)據(jù)成員。153) 異常處理是一種允許兩個(gè)獨(dú)立開(kāi)發(fā)的程序組件在程序執(zhí)行期間遇到程序不正常的情況稱為異常exception 時(shí)相互通信的機(jī)制。154) Try引入一個(gè)局部域,在try中聲明的變量在其它地方不可以引用即使在catch中。155) 使用引用類型的異常聲明catch 子句能夠修改異常對(duì)象但是由throw 表達(dá)式指定的任何變量仍都不受影響。引用只能修改到throw表達(dá)式創(chuàng)建的異常對(duì)象,如果不是創(chuàng)建的比如全局變量就仍然不受影響。注意catch中如果再拋出throw異常,要注意catch()中的對(duì)象是否是引用,如果是引用就拋出它自己。或者就拋出的是try中的異常拋出的對(duì)象。156) Catch all:catch()可以捕獲任何類型的異常,當(dāng)它與catch并列存在的時(shí)候一定要放最后一個(gè),或者要報(bào)錯(cuò)。其它的catch按捕獲順序來(lái),如果獲得一個(gè)就不執(zhí)行其它的catch了。157) 異常規(guī)范exception specification 提供了一種方案它能夠隨著函數(shù)聲明列出該函數(shù)可能拋出的異常它保證該函數(shù)不會(huì)拋出任何其他類型的異常。異常聲明是函數(shù)接口的一部分,它必須在頭文件的函數(shù)聲明上指定。不同地方的同一個(gè)函數(shù)聲明必須帶上異常規(guī)范,如果其中一個(gè)有。切不能累加。當(dāng)拋出了不能被識(shí)別的異常時(shí)候,會(huì)調(diào)用在編譯的時(shí)候就設(shè)置好的unexpected function,默認(rèn)會(huì)去調(diào)用terminate()退出。空的異常規(guī)范保證函數(shù)不會(huì)拋出任何異常。如果函數(shù)沒(méi)有指定異常規(guī)范意味著該函數(shù)可以拋出任何類型的異常。158) 函數(shù)指針作為參數(shù)被引用的時(shí)候不能被內(nèi)聯(lián),影響效率。所以出現(xiàn)了函數(shù)對(duì)象。函數(shù)對(duì)象是一個(gè)類它重載了函數(shù)調(diào)用操作符operator() 該操作符封裝了通常應(yīng)該被實(shí)現(xiàn)為一個(gè)函數(shù)的動(dòng)作典型情況下函數(shù)對(duì)象被作為實(shí)參傳遞給泛型算法當(dāng)然我們也可以定義獨(dú)立的函數(shù)對(duì)象。159) 函數(shù)適配器用于指定函數(shù)對(duì)像的單個(gè)參數(shù)或者取反操作。改變默認(rèn)必須是2元關(guān)系的函數(shù)對(duì)象。Binder和negator。參考c+ primer third version 泛型算法12.3.5。160) C+語(yǔ)言要求綁定在const vector 上的iterator 也必須是const iterator。const 容器只能被綁定在const iterator 上這樣的要求與const 指針只能指向const 數(shù)組的行為一樣在兩種情況下C+語(yǔ)言都努力保證const 容器的內(nèi)容不會(huì)被改變。161) 關(guān)聯(lián)容器map和set在內(nèi)部維護(hù)元素的排序順序,一邊快速查找和獲取。因?yàn)椴辉试S在上面應(yīng)用重新排序的泛型算法。如果要排序必須先將他們拷貝到順序容器vector或list中。162) List是雙向鏈表,它保存有指向上和下一個(gè)鏈表元素的鏈成員??梢园言夭迦氲絣ist的任意位置上或刪除,但是不能隨機(jī)訪問(wèn)。不是連續(xù)的分配內(nèi)存。163) 除了靜態(tài)成員以外的類的數(shù)據(jù)成員不能在類體中被顯示初始化。164) 只有當(dāng)一個(gè)類的類體完整的時(shí)候,它才被視為已經(jīng)定義。所以一個(gè)類不能有自身類型的數(shù)據(jù)成員。但當(dāng)一個(gè)類的類頭被看到的時(shí)候,就已經(jīng)聲明了,所以可以把自身類型的指針或引用作為數(shù)據(jù)成員。165) 雖然每個(gè)類對(duì)象都有自己的類數(shù)據(jù)成員拷貝但是每個(gè)類成員函數(shù)的拷貝只有一份.他們是靠this指針來(lái)區(qū)分這不同的對(duì)象的數(shù)據(jù)的。166) 類的成員函數(shù)如果聲明成常類型的話,放在參數(shù)表和函數(shù)體之間。任何修改類數(shù)據(jù)成員的函數(shù)都不能被聲明為const。但是如果聲明了可以修改類的指針成員指向的對(duì)象的值。const 成員函數(shù)可以被相同參數(shù)表的非const 成員函數(shù)重載例,調(diào)用時(shí)候根據(jù)類是不是定義為const來(lái)匹配函數(shù)。一個(gè)const 類對(duì)象從構(gòu)造完成時(shí)刻到析構(gòu)開(kāi)始時(shí)刻這段時(shí)間內(nèi)被認(rèn)為是const。167) 當(dāng)把一個(gè)類的數(shù)據(jù)成員聲明成為mutable的時(shí)候。它永遠(yuǎn)都不會(huì)是const,可以隨意修改。168) This指針。每個(gè)類成員函數(shù)都含有一個(gè)指向被調(diào)用對(duì)象的指針這個(gè)指針被稱為this。一般情況不需要顯示引用this指針。在類的成員函數(shù)中返回自己 return *this。169) 點(diǎn)操作符和箭頭操作符是左結(jié)合的。170) 靜態(tài)成員和非靜態(tài)的比較。靜態(tài)成員的類型可以是其所屬類的對(duì)象,而份非靜態(tài)只能是該類的對(duì)像的指針或引用。靜態(tài)數(shù)據(jù)成員可以作為類成員函數(shù)的實(shí)參,而非static成員不能。171) 靜態(tài)成員函數(shù)不能聲明為const或valatile,不能在類的外部聲明,沒(méi)有this指針,所以不能類的非靜態(tài)數(shù)據(jù)成員。172) 一般的函數(shù)指針不能賦值為類的成員函數(shù),因?yàn)槿鄙賢his指針。173) 成員數(shù)據(jù)指針的格式 : type classname:* point_name=&classname:member_data174) 成員函數(shù)指針的格式 : return_Type (Class_Name:*Function_Point_Name)()=&Class_Name:Member_Function_Name175) 靜態(tài)數(shù)據(jù)成員指針不需要指定類名,和普通指針一樣。176) Union類,union類的數(shù)據(jù)成員可以是private或public。Union類不能有靜態(tài)數(shù)據(jù)成員或是引用成員。不能有帶有構(gòu)造函數(shù)或析構(gòu)函數(shù)或拷貝賦值操作符的類作為成員類型。Union中的數(shù)據(jù)成員的存儲(chǔ)開(kāi)始位置都一樣,任意的賦值都會(huì)覆蓋以前的數(shù)據(jù),其存儲(chǔ)區(qū)的大小取決于最大的成員的類型。讀取的時(shí)候只可以訪問(wèn)被賦值的那個(gè)變量。177) 匿名union的數(shù)據(jù)成員可以在定義匿名union的域中被直接訪問(wèn)。178) Union是一種節(jié)省空間的類,bit_field是一種節(jié)省空間的成員。179) &操作符不能應(yīng)用在位域上,沒(méi)有指向位域的指針,位域也不能使類的靜態(tài)成員。180) 在類定義中用到的名字必須在使用前被聲明,但是有2種例外。一種是內(nèi)聯(lián)函數(shù)的函數(shù)體中,第二種是被用作缺省實(shí)參的名字,但是該數(shù)據(jù)成員必須是static的。181) 在類外部定義在內(nèi)部通過(guò)typedef聲明的數(shù)據(jù)成員的時(shí)候必須在該數(shù)據(jù)成員前面也加類:。182) 嵌套類之間不能相互訪問(wèn)對(duì)方的私有數(shù)據(jù)成員。除非被對(duì)方聲明為友元類。Friend class class_name.183) 嵌套類的數(shù)據(jù)成員含私有數(shù)據(jù)成員可以在外部被定義。嵌套類可以在外部定義,但是必須在父類中聲明。注意,嵌套類的外部定義和類的繼承格式很像。184) 定義在類外部的子嵌套類不能訪問(wèn)父類的非靜態(tài)成員,必須通過(guò)類對(duì)象的引用或指針。見(jiàn)c+ primer,page 556。185) 在嵌套域的內(nèi)部可以直接訪問(wèn)public類型的靜態(tài)成員,枚舉值,類型名。其中類型名包括:typedef名字,枚舉類型名字,類名字。但是在外部的時(shí)候必須加類名字空間,枚舉值可以不用。因?yàn)槊杜e類型沒(méi)有像類一樣維護(hù)自己的類域。186) 被定義在函數(shù)體內(nèi)的類,叫做局部類。不能被外部的變量訪問(wèn),所以也沒(méi)有靜態(tài)成員。187) 當(dāng)類是有默認(rèn)構(gòu)造函數(shù)初始化的時(shí)候,一般認(rèn)為是沒(méi)有被初始化。188) 顯示初始表初始化類的時(shí)候,它的所有數(shù)據(jù)成員必須是公有的。189) 類的構(gòu)造函數(shù)不能指定返回類型,也不能指定void類型。190) 類的構(gòu)造函數(shù)不能被const和volatile修飾。191) Explicit關(guān)鍵字只能用來(lái)修飾構(gòu)造函數(shù),切提醒構(gòu)造函數(shù)不要提供隱式轉(zhuǎn)換。192) 不是每個(gè)類都必須要析構(gòu)函數(shù)。如果類成員都是值類型的成員則不需要析構(gòu)函數(shù)。193) 只有當(dāng)delete表達(dá)式的指針指向一個(gè)帶有析構(gòu)函數(shù)的類時(shí),編譯器才會(huì)調(diào)用析構(gòu)函數(shù)。194) 類的數(shù)據(jù)成員,const類型或引用類型的時(shí)候必須在成員初始化表中完成。因?yàn)檫@2個(gè)在構(gòu)造函數(shù)開(kāi)始的時(shí)候必須已經(jīng)初始化完成。其它類型的數(shù)據(jù)成員在構(gòu)造函數(shù)或成員初始化表中都無(wú)影響。195) 初始化的順序是按照類的成員定義的順序來(lái)進(jìn)行的,和初始化表中的變量順序沒(méi)有關(guān)系。但是初始化表中的最遲一個(gè)都早于構(gòu)造函數(shù)內(nèi)部的第一個(gè)。成員之間的賦值最好是放在構(gòu)造函數(shù)內(nèi)部。196) 一般最好是在成員初始化表中初始化類的所有類對(duì)象。197) c+重大的一個(gè)缺陷就是不能有效的返回類對(duì)象,即是不能返回局部對(duì)象的引用或指針。其解決辦法是使用了返回值語(yǔ)言擴(kuò)展技術(shù),說(shuō)白了就是把結(jié)果作為一個(gè)引用變量傳入進(jìn)去。198) 函數(shù)重載的時(shí)候,const關(guān)鍵字放最后面,但是要放花括號(hào)之前。199) 只有左操作數(shù)是類類型的時(shí)候才會(huì)考慮類的重載函數(shù)。200) 操作符重載時(shí),類成員和名字空間成員的選擇。操作符的左操作數(shù)不是類對(duì)象類型的時(shí)候,必須用名字空間成員。即是2個(gè)參數(shù)。C+要求,=,(),-操作符必須被定義為類操作符。201) 程序員只能為類類型或枚舉類型的操作數(shù)定義重載操作符202) 操作符預(yù)定義的操作數(shù)個(gè)數(shù)arity 必須被保留例如一元的邏輯非操作符不能被定義為針對(duì)兩個(gè)String 對(duì)象的二元操作符. 四個(gè)預(yù)定義的操作符+ - * 和& 既可被用作一元操作符也可被用作二元操作符.除了operator()以外,其它操作符提供默認(rèn)實(shí)參是非法的。203) 友元聲明以關(guān)鍵字friend 開(kāi)始它只能出現(xiàn)在類定義中因?yàn)橛言皇鞘跈?quán)類的成員所以它不受其所在類的聲明區(qū)域public private 和protected 的影響這里我們選擇把所有友元聲明組織在一起并放在類頭之后。204) 一個(gè)類必須把它希望與之建立友元關(guān)系的重載函數(shù)集中的每個(gè)函數(shù)都聲明為友元, 如果一個(gè)函數(shù)操縱兩個(gè)不同類類型的對(duì)象而且該函數(shù)需要訪問(wèn)這兩個(gè)類的非公有成員則這個(gè)函數(shù)可以被聲明為這兩個(gè)類的友元或者作為一個(gè)類的成員函數(shù)并聲明為另一個(gè)類的友元。205) 只有當(dāng)一個(gè)類的定義已經(jīng)被看到時(shí)它的成員函數(shù)才能被聲明為另一個(gè)類的友元。如果2個(gè)類需要相互把對(duì)方的成員函數(shù)作為自己的一個(gè)友元,那么可以把類直接聲明成為友元。206) C+默認(rèn)內(nèi)置數(shù)據(jù)類型都是有符號(hào)的,所以最左邊的那位都會(huì)被當(dāng)作符號(hào)位,僅僅用來(lái)標(biāo)識(shí)正負(fù)關(guān)系。207) 機(jī)器字表示機(jī)器一次性處理的長(zhǎng)度,比如32位機(jī)就表達(dá)一次性處理32BIT,即是3個(gè)機(jī)器字節(jié)。在32位機(jī)子中:Char占用一個(gè)機(jī)器字節(jié)。Short半個(gè)機(jī)器字(2字節(jié)),int占用一個(gè)機(jī)器字(4字節(jié)),long和int長(zhǎng)度一樣,但是其它機(jī)器中,long是2個(gè)機(jī)器字。Float單精度1個(gè)機(jī)器字,double雙精度2個(gè)機(jī)器字,long double三或四個(gè)機(jī)器字。以u(píng)結(jié)尾的表示無(wú)符號(hào),以L結(jié)尾的int表示長(zhǎng)整形,以L結(jié)尾的浮點(diǎn)型表示擴(kuò)展精度。以f 結(jié)尾的表示單精度,以e結(jié)尾的表示雙精度。默認(rèn)是十進(jìn)制,前面加0表示8進(jìn)制,前面加0X表示十六進(jìn)制。Unsigned int,表示無(wú)符號(hào)整型.signed int表示有符號(hào)整型。208) 轉(zhuǎn)換函數(shù)是一種特殊類型的類的成員函數(shù)。他把一種類型轉(zhuǎn)換成另外一種類型。;格式是operator 類型().不能指定返回類型和參數(shù)表。209) 如果需要編譯器會(huì)在調(diào)用構(gòu)造函數(shù)執(zhí)行用戶定義的轉(zhuǎn)換之前在實(shí)參上應(yīng)用標(biāo)準(zhǔn)轉(zhuǎn)換序列。210) 如果實(shí)參是一個(gè)類類型的對(duì)象類類型的指針類類型的引用或者指向類成員的指針并且該類類型是在一個(gè)用戶聲明的名字空間中被聲明的則在該名字空間中聲明的與函數(shù)調(diào)用同名的函數(shù)也被加入到候選函數(shù)集中;如果實(shí)參是一個(gè)類類型的對(duì)象類類型的指針類類型的引用或者指向類成員的指針并且該類有與函數(shù)調(diào)用同名的友元friend 函數(shù)則該友元函數(shù)被加入到候選函數(shù)集中。211) 如果一個(gè)函數(shù)調(diào)用的實(shí)參是一個(gè)類類型的對(duì)象類類型的指針類類型的引用或者是指向類成員的指針則候選函數(shù)是以下各個(gè)函數(shù)集合的并集在調(diào)用點(diǎn)可見(jiàn)的函數(shù)在定義該類的名字空間中聲明的函數(shù)以及在類成員表中聲明為友元的函數(shù)。212) 調(diào)用點(diǎn)可見(jiàn)的候選函數(shù)集只包含名字解析成功的域中聲明的函數(shù)。即使外部域中有可用函數(shù),也不作為候選函數(shù)。前面的函數(shù)如果都不是可選函數(shù),那么編譯會(huì)提示出錯(cuò)。213) 標(biāo)準(zhǔn)轉(zhuǎn)換序列總是好于用戶定義的轉(zhuǎn)換序列, 用戶定義的轉(zhuǎn)換序列中只能有一個(gè)用戶定義的轉(zhuǎn)換所以在第一個(gè)用戶定義的轉(zhuǎn)換之后只能考慮標(biāo)準(zhǔn)轉(zhuǎn)換。如果兩個(gè)用戶定義的轉(zhuǎn)換序列使用了相同的轉(zhuǎn)換函數(shù)則轉(zhuǎn)換函數(shù)后面的標(biāo)準(zhǔn)轉(zhuǎn)換的等級(jí)被作為選擇最佳用戶定義轉(zhuǎn)換序列的依據(jù)。因?yàn)閮蓚€(gè)用戶定義的轉(zhuǎn)換序列使用了不同的轉(zhuǎn)換函數(shù)所以不能判定哪個(gè)函數(shù)對(duì)該調(diào)用有最佳的參數(shù)類型標(biāo)準(zhǔn)轉(zhuǎn)換序列的等級(jí)也不能被用來(lái)判定最佳轉(zhuǎn)換序列以及最佳參數(shù)類型所以該調(diào)用被編譯器標(biāo)記為二義的。214) 重載解析與成員函數(shù)。不像名字空間函數(shù)成員函數(shù)在類成員表中只能被聲明一次。215) Const與函數(shù)重載解析。Const對(duì)象只能調(diào)用const非靜態(tài)函數(shù)。靜態(tài)成員函數(shù)從不會(huì)因?yàn)楸徽{(diào)對(duì)象或指針的限定修飾符const 或volatile而被排除在可行函數(shù)集之外靜態(tài)成員函數(shù)被認(rèn)為匹配它所在類類型的任何對(duì)象或指針。216) 類模板被視為一個(gè)鏈表。Typename是在標(biāo)準(zhǔn)c+中才引入的,為了幫助編譯器區(qū)分參數(shù)到底是類還是類型變量。標(biāo)準(zhǔn)c+之前的模板參數(shù)不支持缺省實(shí)參。217) 模板定義和定義都可以引用類的模板或類模板的實(shí)例,但是在模板定義的上下文環(huán)境之外,只能使用類模板實(shí)例。218) 標(biāo)準(zhǔn)c+中,聲明一個(gè)類模板實(shí)例的指針或引用不會(huì)導(dǎo)致模板被實(shí)例化;定義一個(gè)類時(shí)需要知道該類的定義。因?yàn)榫幾g器需要知道其大小以便為其分配內(nèi)存。另外,只有就是在解引用或調(diào)用數(shù)據(jù)成員、成員函數(shù)的時(shí)候才能實(shí)例化類模板。219) 類模板的參數(shù)如果是非類型的參數(shù),那它的類型必須是常量表達(dá)式、const對(duì)象的值,名字空間中對(duì)象的地址、對(duì)象的大小。而new表達(dá)式,非const變量的值都不能作為參數(shù)。220) 類模板實(shí)例化的時(shí)候,類型參數(shù)和非類型參數(shù)之間可以進(jìn)行轉(zhuǎn)換。但是必須是下面的這些情況。(1)左值轉(zhuǎn)換:左值到右值的轉(zhuǎn)換,數(shù)組到指針的轉(zhuǎn)換,函數(shù)到指針的轉(zhuǎn)換;(2)限定修飾符轉(zhuǎn)換:從指針類型到常指針類型的轉(zhuǎn)換;(3)提升:從長(zhǎng)度小的到長(zhǎng)度大的類型;(4)整型之間的轉(zhuǎn)換221) 0不能通過(guò)隱式轉(zhuǎn)換成指針,可以通過(guò)static_cast來(lái)顯式完成。222) 類模板的成員函數(shù)本身也是一個(gè)模板。標(biāo)準(zhǔn)c+要求這樣的成員函數(shù)只有在被調(diào)用或者取地址的時(shí)候才被實(shí)例化。223) 類模板中可以使用的友元聲明。(1) 非模板友元類或友元函數(shù),一個(gè)類的成員在被聲明成為類的友元之前必須讓其類已經(jīng)被定義;(2)綁定的友元類模板或函數(shù)模板,1對(duì)1的關(guān)系;(3)非綁定的友元類模板或函數(shù)模板,1對(duì)多的關(guān)系,標(biāo)準(zhǔn)c+才支持這種。注意第二種方法,類部申明友元的時(shí)候,在函數(shù)的名字后面和小括號(hào)的前面必須加。224) 注意第222條款,使用方法2必須在最頂部聲明類和友元函數(shù)的名字,因?yàn)樗麄冊(cè)诮徊媸褂萌菀壮鲥e(cuò)。當(dāng)使用operator的友元函數(shù)要注意在后面還要加.使用方法3僅僅需要注意2個(gè)模板參數(shù)的名字不能一樣。225) 類模板聲明為友元有2種情況:1是將類模板的雖有實(shí)例化對(duì)象都聲明為當(dāng)前類模板的友元,2是只聲明指定類型的類模板為當(dāng)前的友元。226) 類的友元函數(shù)不屬于類,所以不能用public,private,protected等來(lái)修飾。如果有這些修飾符存在。那么應(yīng)該放在他們的外邊。227) 類模板的靜態(tài)數(shù)據(jù)成員。只有當(dāng)程序使用靜態(tài)數(shù)據(jù)成員時(shí)它才會(huì)從模板定義中被真正實(shí)例化類模板的靜態(tài)成員本身就是一個(gè)模板靜態(tài)數(shù)據(jù)成員的模板定義不會(huì)引起任何內(nèi)存被分配只有對(duì)靜態(tài)數(shù)據(jù)成員的某個(gè)特定的實(shí)例才會(huì)分配內(nèi)存每個(gè)靜態(tài)數(shù)據(jù)成員實(shí)例都與一個(gè)類模板實(shí)例相對(duì)應(yīng)因此一個(gè)靜態(tài)數(shù)據(jù)成員的實(shí)例在被引用的時(shí)候總是要通過(guò)一個(gè)特定的類模板實(shí)例。228) 類模板與嵌套類,嵌套類不會(huì)在父類實(shí)例化的時(shí)候就實(shí)例化。除非是被解引用等操作。標(biāo)準(zhǔn)c+中,類模板支持函數(shù)模板和類模板作為自己的一個(gè)元素。229) 如果一個(gè)成員模板被定義在類模板定義之外則在它的定義前面就必須加上類模板參數(shù)表然后再跟上它自己的模板參數(shù)表. 模板參數(shù)不一定與類模板定義中指定的名字相同.230) C+模板編譯模式.(1) 包含編譯模式:成員函數(shù)和靜態(tài)成員的定義必須被包含在和類模板的至少同一個(gè)文件中。 (2) 分離編譯模式:類模板定義和其inline成員函數(shù)定義都被放在頭文件中,而非inline成員函數(shù)和靜態(tài)數(shù)據(jù)成員被放在程序文本中。但是這個(gè)類模板必須定義為export,其靜態(tài)數(shù)據(jù)和成員函數(shù)也可以聲明為export,但是在程序中只能被聲明一次。231) 顯示實(shí)例化類模板 template class Name,它的所有成員也都會(huì)被實(shí)例化,所以這個(gè)時(shí)候需要類提供所有成員的定義。232) 類模板部分特化,在類名字后面加了。并在里面指定了部分實(shí)參。當(dāng)存在類模板部分特化的時(shí)候,會(huì)優(yōu)先調(diào)用這個(gè)模板。但是必須為其提供構(gòu)造函數(shù)。233) 類模板中的名字解析。234) 多臺(tái)是指基類的指針或引用操縱多個(gè)類型(基類的派生類)的能力。235) 動(dòng)態(tài)綁定是在運(yùn)行時(shí)刻解析出需要被調(diào)用的函數(shù)。C+實(shí)現(xiàn)這種機(jī)制的原理是使用了一種虛擬函數(shù)。缺省情況下,函數(shù)是在編譯時(shí)刻靜態(tài)解析。236

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論