




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C+ Primer學(xué)習(xí)筆記第2章 變量和基本類(lèi)型1. 在命令行下看main函數(shù)的返回值,Unix為(echo $?),Windows為(echo %ERRORLEVEL%)。2. 為了兼容C語(yǔ)言,C+中所有的字符串字面值都由編譯器自動(dòng)在末尾添加一個(gè)空字符(null)。3. 多行字面值:在一行的末尾加一反斜線(xiàn)符號(hào)()可將此行和下一行當(dāng)做同一行處理。4. C+支持兩種初始化變量的形式:復(fù)制初始化和直接初始化。復(fù)制初始化語(yǔ)法用等號(hào)(=),直接初始化則是把初始化放在括號(hào)中。5. 聲明和定義:聲明不能初始化,也不會(huì)分配空間。在C+語(yǔ)言中,變量必須且僅能定義一次,而且在使用變量之前必須定義或聲明變量。6.
2、 因?yàn)槌A吭诙x后就不能被修改,所以定義時(shí)必須初始化。非const變量默認(rèn)為extern,const變量默認(rèn)非extern。7. 引用是別名:必須在定義引用時(shí)進(jìn)行初始化。當(dāng)引用初始化后,只要該引用存在,它就保持綁定到初始化時(shí)指向的對(duì)象,不可能將應(yīng)用綁定到另一個(gè)對(duì)象。不能定義引用類(lèi)型的引用。8. const引用是指向const的引用,可以綁定到const對(duì)象、非const對(duì)象和右值。非const引用只能綁定到非const對(duì)象。9. 因?yàn)轭^文件包含在多個(gè)源文件中,所以不應(yīng)該含有變量或函數(shù)的定義。但有三例外:頭文件可以定義類(lèi)、值在編譯時(shí)就知道的const對(duì)象和inline函數(shù)。第3章 標(biāo)準(zhǔn)庫(kù)類(lèi)型1.
3、 不應(yīng)該在頭文件中使用using (namespace),因?yàn)轭^文件會(huì)影響包含它的源文件。2. 任何存儲(chǔ)string的size操作結(jié)果的變量必須為string:size_type類(lèi)型。特別重要的是,不要把size的返回值賦值給一個(gè)int變量。(為什么我測(cè)試可以?)3. 當(dāng)進(jìn)行string對(duì)象和字符串字面值混合連接操作時(shí),+操作符的左右操作數(shù)必須至少有一個(gè)是string類(lèi)型的。4. vector:vector容器內(nèi)的元素可以通過(guò)下標(biāo)操作和迭代器進(jìn)行訪問(wèn)修改,但添加元素必須通過(guò)vector的方法insert、push_back才行。5. const_iterator vs const 的itera
4、tor:const_iterator是指迭代器指向的內(nèi)容的值不能改變,用來(lái)只讀vector;const的iterator是指迭代器不能改變,很少用到。6. 任何改變vector長(zhǎng)度的操作都會(huì)使已存在的迭代器失效。例如,再調(diào)用push_bach之后,就不能再信賴(lài)指向vector的迭代器的值了。7. string、vector、bitset是由標(biāo)準(zhǔn)庫(kù)提供的類(lèi)型,所以他們都有相應(yīng)的方法;C+提供的內(nèi)置類(lèi)型int、數(shù)組、指針等都沒(méi)有提供方法。第4章 數(shù)組和指針1. 數(shù)組維數(shù)必須用值大于1的常量表達(dá)式定義,不允許數(shù)組直接復(fù)制和賦值。2. 指針保存0值,表明它不指向任何對(duì)象,所以刪除指針后置0是個(gè)好辦法。
5、3. C+提供了一種特殊的指針類(lèi)型void*,它可以保存任何類(lèi)型對(duì)象的地址。void*指針只支持幾種有限的操作:與另一個(gè)指針進(jìn)行比較;向函數(shù)傳遞void*指針或者從函數(shù)返回void*指針;給另一個(gè)void*指針賦值。不允許使用void*指針操縱它所指向的對(duì)象。4. 指向const對(duì)象的指針和const指針:指向const對(duì)象的指針(const int * pi)不能通過(guò)該指針修改指向?qū)ο蟮闹?;const指針(int *const pi)指針本身不能變。 指針和引用:引用是別名,必須在定義時(shí)初始化,且定義后不能再綁定到其他對(duì)象。5. C風(fēng)格字符串:char數(shù)組,且以null結(jié)束。char ca=
6、c,+,+,o;char *ca1=”primer”; sizeof的時(shí)候會(huì)算上0,strlen不會(huì)算上0。6. 用new創(chuàng)建動(dòng)態(tài)數(shù)組:int size=get_size();int *p=new intsize; 用delete釋放空間:delete p;(必須,數(shù)組的釋放不同一般指針的釋放)7. int *ip4:聲明了一個(gè)4維度的指針數(shù)組int (*ip)4:聲明了一個(gè)指向數(shù)組的指針,可以迭代二維數(shù)組。第5章 表達(dá)式1. sizeof操作符的作用是返回一個(gè)對(duì)象或類(lèi)型名的長(zhǎng)度,返回值的類(lèi)型為size_t。數(shù)組ia的元素個(gè)數(shù):int size=sizeof(ia)/sizeof(*ia);2
7、. 逗號(hào)表達(dá)式是一組由逗號(hào)分隔的表達(dá)式,這些表達(dá)式從左向右計(jì)算。逗號(hào)表達(dá)式的結(jié)果是其最右邊表達(dá)式的值。3. 類(lèi)型轉(zhuǎn)換(分隱式轉(zhuǎn)換和顯式轉(zhuǎn)換)。有四種強(qiáng)制類(lèi)型轉(zhuǎn)換符:static_cast、dynamic_cast、const_cast、reinterpret_cast。dynamic_cast操作符用于將基類(lèi)類(lèi)型對(duì)象的引用或指針轉(zhuǎn)換為同一繼承層次中其他類(lèi)型的引用或指針。const_cast用于轉(zhuǎn)換掉表達(dá)式的const性質(zhì)。static_cast能顯式完成編譯器隱式執(zhí)行的任何類(lèi)型轉(zhuǎn)換。reinterpret_cast通常為操作數(shù)的位模式提供較低層次的重新解釋。舊式強(qiáng)制轉(zhuǎn)換:type (expr)
8、 或 (type) expr兩種形式。第6章 語(yǔ)句1. Switch case:case標(biāo)號(hào)必須是整型常量表達(dá)式(case 3.14: 和 case ival:就不行)。在switch內(nèi)部要定義常量,必須用塊結(jié)構(gòu)(防止影響其他case)。2. 標(biāo)準(zhǔn)異常類(lèi)定義在四個(gè)頭文件中:i. exception頭文件定義了最常見(jiàn)的異常類(lèi),它的類(lèi)名是exception。這個(gè)類(lèi)只通知異常的產(chǎn)生,但不會(huì)提供更多的信息。ii. stdexception頭文件定義了幾種常見(jiàn)的異常類(lèi):runtime_error, range_error, overflow_error, underflow_error, logic_e
9、rror, domain_error(參數(shù)的結(jié)果值不存在), invalid_argument, length_error, out_of_rangeiii. new頭文件定義了bad_alloc異常類(lèi)型,提供因無(wú)法分配內(nèi)存而由new拋出的異常。iv. type_info頭文件定義了bad_cast異常類(lèi)型,dynamic_cast失敗拋出的異常。3. 預(yù)處理器定義了四種在調(diào)試時(shí)非常有用的常量:_ _ FILE_ _ 文件名_ _LINE_ _當(dāng)前行號(hào)_ _TIME_ _ 文件被編譯的時(shí)間_ _DATE_ _文件被編譯的日期第7章 函數(shù)1. 形參的初始化與變量的初始化一樣:如果形參具有非引用類(lèi)
10、型,則復(fù)制實(shí)參的值;如果形參為引用類(lèi)型,則它只是實(shí)參的別名。2. 如果使用引用形參的唯一目的是避免復(fù)制實(shí)參,則應(yīng)將形參定義為const引用。3. 引用指針的形參:void ptrswap(int *&v1,int *&v2)4. c+程序員傾向與通過(guò)傳遞指向容器中需要處理的元素的迭代器來(lái)傳遞容器。5. 數(shù)組當(dāng)形參時(shí),非引用(起始是傳遞指針,能改變數(shù)組的內(nèi)容)會(huì)忽略數(shù)組第一維。通過(guò)引用傳遞數(shù)組: void printValue(int (&arr) 10)(括號(hào)是必須的)6. 理解返回引用至關(guān)重要的是:千萬(wàn)不能返回局部變量的引用。7. 既可以在函數(shù)聲明也可以在函數(shù)定義中指定默認(rèn)實(shí)參。但是,在一個(gè)
11、文件中,只能為一個(gè)形參指定默認(rèn)實(shí)參一次。通常,應(yīng)在函數(shù)聲明中指定默認(rèn)實(shí)參,并將該聲明放在合適的頭文件中。8. 內(nèi)聯(lián)函數(shù)應(yīng)該在頭文件中定義,這一點(diǎn)不同于其他函數(shù)。在頭文件中加入或修改內(nèi)聯(lián)函數(shù)時(shí),使用了該頭文件的所有源文件都必須重新編譯。9. 指向函數(shù)的指針:bool (*pf)(const string &, const sting &)(*pf兩側(cè)的圓括號(hào)是必需的)。函數(shù)指針只能通過(guò)同類(lèi)型的函數(shù)或函數(shù)指針或0值常量表達(dá)式進(jìn)行初始化或賦值。如 bool lengthCompare(const sting &, const string&);pf=lengthCompare;調(diào)用時(shí)可以:pf(“h
12、i”,”bye”) 或 (*pf) (“hi”,”bye”)。第8章 標(biāo)準(zhǔn)IO庫(kù)1. I/O對(duì)象不可復(fù)制或賦值,故函數(shù)參數(shù)和返回值只能是I/O對(duì)象的指針或引用。2. 標(biāo)準(zhǔn)庫(kù)提供了三種類(lèi)型的流:iostream,fstream,stringstream,多次讀取時(shí)要注意流狀態(tài)的清除。3. 刷新緩存區(qū):使用endl(插入換行符), flush(不添加任何字符), ends(插入null), 使用unitbuf操作符(coutunitbuf”result”符號(hào),以示這是兩個(gè)分開(kāi)的符號(hào),否則,系統(tǒng)會(huì)認(rèn)為是單個(gè)符號(hào),為右移操作符,并結(jié)果導(dǎo)致編譯時(shí)錯(cuò)誤;example:vector vector line
13、s;4. 容器元素類(lèi)型必須滿(mǎn)足兩個(gè)約束: 元素類(lèi)型必須支持賦值運(yùn)算 元素類(lèi)型的對(duì)象必須可以復(fù)制引用不支持一般意義的賦值運(yùn)算,IO標(biāo)準(zhǔn)庫(kù)類(lèi)型不支持賦值和復(fù)制操作,所以不能創(chuàng)建存儲(chǔ)他們的容器。5. 順序容器上的操作 初始化(適用于關(guān)聯(lián)容器)i. C c默認(rèn)初始化,創(chuàng)建一個(gè)空的容器ii. C c(c2) 創(chuàng)建容器c2的副本c,兩個(gè)容器的類(lèi)型和元素類(lèi)型都必須相同iii. C c(b,e) 創(chuàng)建c,其元素是迭代器b和c標(biāo)示的范圍內(nèi)元素的副本,只要迭代器存儲(chǔ)的值能轉(zhuǎn)化為容器的元素即可,不需要容器類(lèi)型相同。iv. C c(n,t) / C c(n) 創(chuàng)建有n個(gè)值為t(或默認(rèn)值)的容器c,只適用于順序容器。
14、向容器內(nèi)添加元素 有三類(lèi)函數(shù)push_back()、push_front()、insert(),用insert()在指定位置插入單個(gè)元素時(shí),返回指向新元素的迭代器,其他的都返回void 容器大小操作size(), max_size(), empty() resize()。resize()能刪除多出來(lái)的元素。 訪問(wèn)元素用迭代器迭代容器或者使用下標(biāo)操作(list不支持下標(biāo)操作) 刪除元素erase()(返回指向刪除元素后的迭代器), clear(), pop_back(), pop_front() (pop_操作只刪除元素,不返回刪除的元素值,返回void) assign賦值操作 , swap 交
15、換容器操作(不會(huì)破壞迭代器)6. list vs vector deque list的元素不是連續(xù)存儲(chǔ),所以不支持隨機(jī)訪問(wèn),所以不支持下標(biāo)操作()和at()操作,其上的迭代器不支持 +n 操作和大小比較操作(只支持等于,不等操作) vector不支持前端操作(push_front() pop_front())7. 修改容器時(shí),會(huì)使容器上的迭代器失效。vector和deque連續(xù)存儲(chǔ),在中間插入刪除元素時(shí),會(huì)重組織存儲(chǔ)。8. string類(lèi)型不支持以棧方式操縱容器;string支持的其他操作:substr append replace find rfind find_frist_of compa
16、re 。第10章 關(guān)聯(lián)容器1. 標(biāo)準(zhǔn)庫(kù)提供的關(guān)聯(lián)容器有:map,set,multimap, multiset。map存儲(chǔ)鍵值對(duì),set存儲(chǔ)單個(gè)鍵,multi支持同一個(gè)見(jiàn)多次出現(xiàn)。2. pair類(lèi)型和make_pair函數(shù):對(duì)map上的迭代器解引用是pair對(duì)象。3. map、set上的鍵類(lèi)型,唯一的約束就是必須支持操作符,至于是否支持其他的關(guān)系或相等運(yùn)算,則不做要求。4. map,set,multimap,multiset 都支持insert,count,find,erase操作以及l(fā)ower_bound,upper_bound, equal_range操作(注意他們的返回值),初始化見(jiàn)順序容
17、器; 只有map支持下標(biāo)操作,而且與下標(biāo)訪問(wèn)數(shù)組或vector的行為截然不同:用下標(biāo)訪問(wèn)不存在的元素將導(dǎo)致在map容器中添加一個(gè)新元素,它的鍵即為該下標(biāo)值,值為值類(lèi)型的默認(rèn)初始化值。第11章 泛型算法1. 泛型算法中,所謂“泛型“指的是兩個(gè)方面:這些算法可作用與各種不同的容器類(lèi)型,而這些容器又可以容納多種不同的元素。泛型算法必須包含頭文件,算術(shù)算法還必須包含頭文件。插入器(inserter)包含在頭文件中。2. 泛型算法的形參模式: alg (beg, end, beg2, end2, other parms)、beg,end標(biāo)記第一個(gè)范圍,這兩個(gè)參數(shù)泛型算法都有;beg2,end2標(biāo)記第二個(gè)
18、范圍,可能沒(méi)有這個(gè)兩個(gè)參數(shù);parms表示其他算法需要的值或謂詞。3. 算法不直接修改容器的大小,如果需要添加和刪除元素,則必須使用容器操作。4. 泛型算法的分類(lèi) 只讀算法:只讀輸入范圍內(nèi)的元素,而不會(huì)寫(xiě)這些元素。find(), accumulate(), find_first_of()是只讀算法; 寫(xiě)容器元素算法:將數(shù)據(jù)寫(xiě)入第一或第二輸入范圍。fill(), fill_n(), copy(), replace() 都是這類(lèi)算法。直接將元素寫(xiě)入目標(biāo)很危險(xiǎn),因?yàn)榉盒退惴ú粫?huì)調(diào)用容器提供的操作(如insert)(相當(dāng)于用下標(biāo)讀vector的內(nèi)容,再修改),所以很類(lèi)算法一般要和插入迭代器配合使用。有
19、三種插入迭代器:back_inserter,創(chuàng)建使用push_back實(shí)現(xiàn)插入的迭代器;front_inserter,使用push_front實(shí)現(xiàn)插入(不能用在vector上);inserter,使用insert實(shí)現(xiàn)插入。 vector ivec; replace_copy(ilist.begin(), ilist.end(), inserter(ivec,ivec.begin(), 0, 42); 對(duì)容器元素重新排序的算法:sort(), unique() 5. 五種迭代器 輸入迭代器:讀,不能寫(xiě);只支持自增運(yùn)算。istream_iterator是輸入迭代器 輸出迭代器:寫(xiě),不能讀;只支持自
20、增運(yùn)算。ostream_iterator是輸出迭代器 前向迭代器:讀和寫(xiě),只支持自增運(yùn)算。replace算法需要前向迭代器 雙向迭代器:讀和寫(xiě),支持自增和自減運(yùn)算,map、set、list提供雙向迭代器。Reverse算法需要雙向迭代器 隨機(jī)訪問(wèn)迭代器:讀和寫(xiě),支持完整的迭代器算術(shù)運(yùn)算,string、vector和deque提供雙向迭代器。6. list容器特有的算法list上提供雙向迭代器,故很多需要隨機(jī)訪問(wèn)迭代器的算法不能在其上運(yùn)行,故標(biāo)準(zhǔn)庫(kù)為list容器定義了更精細(xì)的操作集合,如merge(), remove(), sort(), reverse(), splice(), unique(
21、)第12章 類(lèi)1. 在類(lèi)內(nèi)部定義的成員函數(shù),將自動(dòng)作為inline處理。也可以顯式的將成員函數(shù)聲明為inline。inline成員函數(shù)的定義必須在調(diào)用該函數(shù)的每個(gè)源文件中是可見(jiàn)的,故inline函數(shù)的定義通常放在定義該類(lèi)的頭文件中。2. 類(lèi)聲明:為了在類(lèi)定義之前使用它,我們可以先聲明它,此時(shí)該類(lèi)稱(chēng)為不完全類(lèi)型。不完全類(lèi)型只能以有限訪問(wèn)時(shí)用。不能定義該類(lèi)型的對(duì)象。不完全類(lèi)型只能用于定義指向該類(lèi)型的指針及引用,或者用與聲明(而不是定義)使用該類(lèi)型作為形參類(lèi)型或返回類(lèi)型的函數(shù)。類(lèi)的聲明一般用來(lái)編寫(xiě)相互依賴(lài)的類(lèi)。3. 可以把數(shù)據(jù)成員聲明為mutable(不能同時(shí)為const修飾),mutable數(shù)據(jù)成
22、員可以在const成員函數(shù)中修改。4. 當(dāng)成員函數(shù)的返回類(lèi)型在類(lèi)中定義時(shí),而且是在類(lèi)外定義的,則定義時(shí)需要使用完全限定名。5. 構(gòu)造函數(shù)不能聲明為const。必須對(duì)任何const或引用類(lèi)型成員以及沒(méi)有默認(rèn)構(gòu)造函數(shù)的類(lèi)類(lèi)型的任何成員使用初始化式。使用構(gòu)造函數(shù)初始化列表初始化,數(shù)據(jù)成員被初始化的次序就是類(lèi)定義成員的次序,而不是在構(gòu)造函數(shù)初始化列表中的次序。6. 使用默認(rèn)實(shí)參的構(gòu)造函數(shù)能減少代碼重復(fù)。7. 只有當(dāng)一個(gè)類(lèi)沒(méi)有定義構(gòu)造函數(shù)時(shí),編譯器才會(huì)自動(dòng)生成一個(gè)默認(rèn)構(gòu)造函數(shù)。8. 隱式類(lèi)類(lèi)型轉(zhuǎn)換:可以用單個(gè)實(shí)參調(diào)用的構(gòu)造函數(shù),定義了從形參類(lèi)型到該類(lèi)類(lèi)型的一個(gè)隱式轉(zhuǎn)換??梢詫?gòu)造函數(shù)聲明為explici
23、t,來(lái)防止隱式轉(zhuǎn)換。explicit只能用于類(lèi)內(nèi)部聲明上(不能用于定義上)。9. 注意友元聲明的順序:聲明類(lèi)A ,把類(lèi)A聲明為B的友元(在類(lèi)B的定義中),定義類(lèi)A(需要用到B的定義)。10. static類(lèi)成員 static成員函數(shù)不是任何對(duì)象的組成部分,故沒(méi)有this形參,可以直接使用類(lèi)的static成員,但不能直接使用非static成員,不能被聲明為const和虛函數(shù)??梢允褂妙?lèi)作用域操作符從類(lèi)中直接調(diào)用static成員,也可以通過(guò)對(duì)象調(diào)用。 static數(shù)據(jù)成員必須在類(lèi)定義體的外面定義(正好一次),不能通過(guò)類(lèi)構(gòu)造函數(shù)初始化,而是應(yīng)該在外面定義時(shí)初始化。static關(guān)鍵值只能用于類(lèi)定義體內(nèi)
24、部的聲明中,定義時(shí)不能標(biāo)示為static。const static數(shù)據(jù)成員可以在類(lèi)的定義體中初始化,但仍必須在類(lèi)的定義體外部定義(不必再指定初始化值)。 static成員不同與非static成員的使用:static數(shù)據(jù)成員的類(lèi)型可以是該成員所屬的類(lèi)類(lèi)型(Class Bar static Bar mem;),非static成員被限定聲明為其自身類(lèi)對(duì)象的指針或引用(因?yàn)檫@時(shí)類(lèi)還沒(méi)定義完,相當(dāng)于類(lèi)的向前聲明);同樣,static數(shù)據(jù)成員可以作默認(rèn)實(shí)參,非static不能(因?yàn)樗荒塥?dú)立于所屬對(duì)象)。第13章 復(fù)制控制1. 復(fù)制控制函數(shù)包括復(fù)制構(gòu)造函數(shù)、賦值操作符、析構(gòu)函數(shù) 復(fù)制構(gòu)造函數(shù):只有單個(gè)參數(shù)
25、,而且該形參是對(duì)本類(lèi)類(lèi)型對(duì)象的引用(常用const修飾),如T(const T&)。如果沒(méi)有定義復(fù)制構(gòu)造函數(shù)(即使定義了其他構(gòu)造函數(shù)),編譯器會(huì)為我們合成一個(gè)執(zhí)行逐個(gè)成員初始化,將新對(duì)象初始化為原對(duì)象的副本。所以為了防止復(fù)制,類(lèi)必須顯式聲明其復(fù)制構(gòu)造函數(shù)為private。不允許復(fù)制的類(lèi)對(duì)象只能作為引用或指針傳遞給函數(shù)或從函數(shù)返回,也不能用作容器的元素。 賦值操作符:就是重載=操作符,如T& operator=(const T&)(注意返回值為類(lèi)的引用,因?yàn)?返回左操作符)。合成賦值操作符,將右操作數(shù)對(duì)象的每個(gè)成員賦值給左操作數(shù)對(duì)象的對(duì)應(yīng)成員,還能對(duì)數(shù)組賦值。復(fù)制和賦值常一起使用。 析構(gòu)函數(shù):構(gòu)
26、造函數(shù)的互補(bǔ),釋放對(duì)象獲得的資源。合成構(gòu)造函數(shù)不會(huì)自動(dòng)刪除指針對(duì)象所指向的對(duì)象。如果類(lèi)需要析構(gòu)函數(shù),則它也需要賦值操作符和復(fù)制構(gòu)造函數(shù),這是一個(gè)有用的經(jīng)驗(yàn)法則,常稱(chēng)為三法則(rule of three)。析構(gòu)函數(shù)與復(fù)制構(gòu)造函數(shù)或賦值操作符之間的一個(gè)重要區(qū)別是:即使我們編寫(xiě)了自己的析構(gòu)函數(shù),合成析構(gòu)函數(shù)仍然運(yùn)行。2. 管理指針成員:包含指針的類(lèi)需要特別注意復(fù)制控制,原因是復(fù)制指針時(shí)只復(fù)制指針中的地址,而不會(huì)復(fù)制指針指向的對(duì)象。 默認(rèn)(合成)復(fù)制/賦值管理指針,指針共享同一對(duì)象,可能出現(xiàn)懸垂指針。 用智能指針管理指針復(fù)制/賦值:新定義一個(gè)類(lèi)管理指針,并增加一個(gè)計(jì)數(shù)功能,當(dāng)復(fù)制/賦值時(shí)計(jì)數(shù)加一,對(duì)象
27、銷(xiāo)毀時(shí)(析構(gòu)函數(shù))減一,當(dāng)計(jì)數(shù)為0時(shí),釋放指針。 定義值型類(lèi):給指針成員提供值語(yǔ)義,創(chuàng)建一個(gè)新對(duì)象。3. 復(fù)制/賦值操作要考慮自己復(fù)制/賦值自己。第14章 重載操作符與轉(zhuǎn)換1. 重載操作符不能創(chuàng)建任何新的操作符,不能改變操作符的優(yōu)先級(jí)、結(jié)合性或操作數(shù)數(shù)目。2. 重載操作符的定義i. 形式是保留字operator后接許定義的操作符符號(hào),如item operator+(const item&, const item&)ii. 重載操作符必須具有至少一個(gè)類(lèi)類(lèi)型或枚舉類(lèi)型的操作符。這條規(guī)則強(qiáng)制重載操作符不能重新定義用于內(nèi)置類(lèi)型對(duì)象的操作符的含義。iii. 重載操作符可以定義為類(lèi)的成員函數(shù)或非成員函數(shù)i
28、. 作為類(lèi)成員的重載函數(shù),其形參看起來(lái)比操作數(shù)數(shù)目少1。作為成員函數(shù)的操作符有一個(gè)隱含的this形參,限定為第一個(gè)操作數(shù)(故輸入輸出操作符不能重載為類(lèi)成員)ii. 操作符定義為非成員函數(shù)時(shí),通常必須將他們?cè)O(shè)置為所操作類(lèi)的友元,以訪問(wèn)類(lèi)的私有變量。3. 重載操作符的設(shè)計(jì)i. 不要重載具有內(nèi)置含義的操作(逗號(hào)、取地址、邏輯與、邏輯或等操作通常不重載)ii. 重載操作符是為了使用方便,當(dāng)一個(gè)重載操作符的含義不明顯,或操作很少時(shí),沒(méi)必要重載操作符,定義普通函數(shù)就行了。iii. 選擇成員或非成員的實(shí)現(xiàn):賦值(=)、下標(biāo)( )、調(diào)用(())、成員訪問(wèn)(-)、轉(zhuǎn)換操作符等操作必須定義為成員;輸入和輸出操作符
29、必須定義為非成員;對(duì)等的操作符,如算法操作符、相等操作符、關(guān)系操作符和位操作符等對(duì)稱(chēng)的操作符,最好定義為非成員;改變對(duì)象狀態(tài)或與給定類(lèi)型緊密聯(lián)系的一些操作符,如自增、自減和解引用,通常定義為類(lèi)成員。4. 輸出操作符通常應(yīng)進(jìn)行最小限度的格式化,不應(yīng)該輸出換行符;輸入操作符必須處理錯(cuò)誤和文件結(jié)束的可能性,如果可能,要確定錯(cuò)誤回復(fù)措施,保證數(shù)據(jù)是內(nèi)在一致的。5. 重載操作符需要注意返回值的類(lèi)型:輸入、輸出操作符返回對(duì)第一個(gè)參數(shù)(流對(duì)象)的引用;加法(+)操作符返回新建的對(duì)象,自增、自減對(duì)象也是返回新建的對(duì)象;復(fù)合操作符、賦值操作符返回第一個(gè)操作數(shù)的引用;下標(biāo)( )操作符返回對(duì)應(yīng)下標(biāo)內(nèi)容的引用;解引用
30、(*)返回對(duì)象的引用;箭頭(-)操作符一般返回指向?qū)ο蟮闹羔槨?. 讀且返回引用的操作符,如下標(biāo)、箭頭、解引用等,應(yīng)該提供const版本和非const版本7. 自增、自減操作符:為了區(qū)別前綴和后綴,后綴式操作符函數(shù)接受一個(gè)額外的(無(wú)用的)int型形參,如 item operator+(int) 為后綴式。8. 調(diào)用操作符和函數(shù)對(duì)象i. 調(diào)用操作符的定義: int operator() (int val),調(diào)用看起來(lái)像個(gè)函數(shù)調(diào)用: int value=item(10)。定義了調(diào)用操作符的類(lèi),其對(duì)象稱(chēng)為函數(shù)對(duì)象,函數(shù)對(duì)象比函數(shù)更靈活,因?yàn)樗鼈兛梢愿淖兂蓡T變量(即函數(shù)的參數(shù))ii. 標(biāo)準(zhǔn)庫(kù)定義了一組
31、算術(shù)、關(guān)系、與邏輯函數(shù)對(duì)象類(lèi),包含在functional頭文件中。9. 標(biāo)準(zhǔn)庫(kù)定義的函數(shù)對(duì)象i. 使用:他們都是模板類(lèi),plus intAdd; int sum=intAdd(10,100);ii. 分為一元函數(shù)對(duì)象(接受一個(gè)參數(shù))和二元函數(shù)對(duì)象iii. 標(biāo)準(zhǔn)庫(kù)還定義了函數(shù)適配器來(lái)特化和擴(kuò)展函數(shù)對(duì)象。綁定器:bindlst和bind2nd,綁定一個(gè)參數(shù)到函數(shù)對(duì)象的第一個(gè)或第二個(gè)參數(shù);求反器:not1和not2,求反一元或二元函數(shù)對(duì)象。not1 ( bind2nd ( less_equal() , 10 ) )10. 轉(zhuǎn)換操作符:就是定義從類(lèi)類(lèi)型的轉(zhuǎn)換(到類(lèi)類(lèi)型的轉(zhuǎn)換是構(gòu)造函數(shù))i. 通用形式:
32、operator type()(通常應(yīng)定義為const),返回一個(gè)type類(lèi)型的對(duì)象(雖然沒(méi)有返回值),這樣類(lèi)型就可以(默認(rèn))轉(zhuǎn)換為type類(lèi)型。ii. 類(lèi)類(lèi)型轉(zhuǎn)換后不能再跟另一個(gè)類(lèi)類(lèi)型轉(zhuǎn)換。class A operator B(); class B operator C();A a : B b ; C c; 不能直接 c=a,應(yīng)該分成兩步:b=a; c=biii. 轉(zhuǎn)換操作符使用好了能簡(jiǎn)潔代碼,但特別容易引起二義性。下面幾條經(jīng)驗(yàn)規(guī)則會(huì)有所幫組:i. 不要定義相互轉(zhuǎn)換的類(lèi),即如果類(lèi)Foo具有接受類(lèi)Bar的對(duì)象的構(gòu)造函數(shù),不要再為類(lèi)Bar定義到類(lèi)型Foo的轉(zhuǎn)換操作符,否則 Foo foo=bar
33、有二義性ii. 避免到內(nèi)置算術(shù)類(lèi)型的轉(zhuǎn)換。集體而言,如果定義了到算術(shù)類(lèi)型的轉(zhuǎn)換,則(1)不要定義接受算術(shù)類(lèi)型的操作符的重載版本,讓轉(zhuǎn)換去完成該功能(2)不要定義轉(zhuǎn)換到一個(gè)以上算術(shù)類(lèi)型的轉(zhuǎn)換,讓標(biāo)準(zhǔn)轉(zhuǎn)換提供到其他算術(shù)類(lèi)型的轉(zhuǎn)換。第15章 面向?qū)ο缶幊?. 虛函數(shù):基類(lèi)希望派生類(lèi)重新定義的函數(shù)定義為virtual。除了構(gòu)造函數(shù)外,任意非static成員函數(shù)都可以是虛函數(shù)(一般需要定義虛析構(gòu)函數(shù))。保留字virtual只在類(lèi)內(nèi)部的成員函數(shù)聲明中出現(xiàn),不能用在類(lèi)定義體外部出現(xiàn)的函數(shù)定義上。派生類(lèi)型必須對(duì)想要重定義的每個(gè)繼承成員進(jìn)行聲明,且必須與基類(lèi)中的定義方式完全匹配(只有一個(gè)例外,返回對(duì)基類(lèi)型的引用
34、或指針,可以變?yōu)榉祷嘏缮?lèi)型的引用或指針)。一旦函數(shù)在基類(lèi)中聲明為虛函數(shù),它就一直為虛函數(shù)。5. 動(dòng)態(tài)綁定:動(dòng)態(tài)綁定使編譯器能夠在運(yùn)行時(shí)決定使用基類(lèi)中定義的函數(shù)還是派生類(lèi)中定義的函數(shù)。要觸發(fā)動(dòng)態(tài)綁定,必須滿(mǎn)足兩個(gè)條件:第一,只有指定為虛函數(shù)的成員函數(shù)才能進(jìn)行動(dòng)態(tài)綁定;第二,必須通過(guò)基類(lèi)類(lèi)型的引用或指針進(jìn)行函數(shù)調(diào)用。6. 派生類(lèi):定義派生類(lèi)形式 class classname: access-label base-class (派生類(lèi)對(duì)基類(lèi))訪問(wèn)權(quán)限:public和private跟其他非繼承對(duì)象一樣,關(guān)鍵是protected。protected成員可以被派生類(lèi)對(duì)象訪問(wèn),但不能被該類(lèi)型的普通用戶(hù)訪
35、問(wèn)。此外,protected還有另一重要性質(zhì):派生類(lèi)只能通過(guò)派生類(lèi)對(duì)象訪問(wèn)其基類(lèi)的protected成員,派生類(lèi)對(duì)其基類(lèi)類(lèi)型對(duì)象的protected成員沒(méi)有特殊訪問(wèn)權(quán)限。 成員在派生類(lèi)中的訪問(wèn)級(jí)別:是由成員在基類(lèi)中的級(jí)別,和繼承方式access-label共同決定的。如果要恢復(fù)在基類(lèi)中的訪問(wèn)級(jí)別(只能是public級(jí)別),則用using base-class:(成員名)。 public派生類(lèi)繼承基類(lèi)的接口;使用private或protected派生的類(lèi)不繼承基類(lèi)的接口,這些派生通常稱(chēng)為實(shí)現(xiàn)繼承。7. 友元關(guān)系不能繼承。8. 即使析構(gòu)函數(shù)沒(méi)有工作要做,繼承層次的根類(lèi)也應(yīng)該定義一個(gè)虛析構(gòu)函數(shù)。9.
36、 通過(guò)基類(lèi)的引用或指針調(diào)用函數(shù),首先在基類(lèi)中找:如果函數(shù)非虛函數(shù),則直接調(diào)用基類(lèi)的該函數(shù);如果為虛函數(shù),則看派生類(lèi)是否重新定義了虛函數(shù),如果定義了,則調(diào)用派生類(lèi)的方法,不需要管派生類(lèi)是否進(jìn)行了其他重載(會(huì)屏蔽基類(lèi)的函數(shù)),這與通過(guò)對(duì)象調(diào)用不同。10. 純虛函數(shù):在函數(shù)形參表后面寫(xiě)上=0以指定純虛函數(shù)。含有(或繼承)一個(gè)或多個(gè)純虛函數(shù)的類(lèi)是抽象基類(lèi),不能創(chuàng)建抽象類(lèi)型的對(duì)象。11. 容器與繼承:不應(yīng)該用容器保存基類(lèi)類(lèi)型的對(duì)象,因?yàn)檫@樣會(huì)把派生類(lèi)中多余的成員切掉,應(yīng)該保存基類(lèi)類(lèi)型的指針(引用不能一般意義的賦值,不能保存在容器中)。指針的復(fù)制和賦值需要特別小心,句柄類(lèi)就是用來(lái)存儲(chǔ)和管理基類(lèi),以安全的進(jìn)
37、行指針的復(fù)制和賦值。第16章 模板與泛型編程11. 泛型編程就是以獨(dú)立于任何特定類(lèi)型的方式編寫(xiě)代碼。12. 模板定義:template (inline) T min()。要定義為內(nèi)聯(lián)函數(shù),inline必須放在template后。模板形參可以是表示類(lèi)型的類(lèi)型形參,也可以是表示常量表達(dá)式的非類(lèi)型形參,非類(lèi)型模板實(shí)參必須是編譯時(shí)常量表達(dá)式。13. 模板形參不能為空。模板形參的名字不能在模板內(nèi)部重用。聲明必須指出函數(shù)或類(lèi)是一個(gè)模板(帶上template)。14. 用typename在模板定義內(nèi)部指定類(lèi)型:如T:Y既可能是類(lèi)型也可以是數(shù)據(jù)成員,為了顯式指定為類(lèi)型,可以使用:typename T:Y。15
38、. 類(lèi)型形參的實(shí)參受限轉(zhuǎn)換:類(lèi)型為模板形參的那些實(shí)參轉(zhuǎn)換受限,類(lèi)型必須完全匹配。16. 函數(shù)模板的顯式實(shí)參:當(dāng)模板實(shí)參推斷不能確定模板類(lèi)型時(shí),需要顯式指定模板形參所用的類(lèi)型或值。template class T1, class T2, class T3) T1 sum(T2,T3);此時(shí)需要顯式指定T1,long val=sum (i,lng)。(顯式模板實(shí)參從左到右與對(duì)應(yīng)模板相匹配。) 顯式實(shí)參后可以類(lèi)型轉(zhuǎn)換:sum(intVale,floatVale)17. 標(biāo)準(zhǔn)C+為編譯模板代碼定義了兩種模型:包含編譯模型和分別編譯模型。 包含編譯模型:在聲明模板的頭文件中添加一條#include,引入
39、包含相關(guān)定義的源文件。分別編譯模型:定義模板時(shí),在template之前包含關(guān)鍵字export實(shí)現(xiàn)。18. 在類(lèi)外定義類(lèi)的成員函數(shù)的開(kāi)頭應(yīng)該是:template ret-type Queue:member-name 。19. 類(lèi)模板中的友元聲明i. 普通友元:以非模板函數(shù)或非模板類(lèi)為模板類(lèi)的友元,跟普通的一樣ii. 一般模板友元關(guān)系:template class Bartemplate friend class Fool;/一對(duì)多的關(guān)系template friend void function(cons T&);/一對(duì)多的關(guān)系iii. 特定的模板友元關(guān)系tempalte class Barfri
40、end class Fool2;friend class Fool;friend void function(const Type&;20. 模板特化:指定一個(gè)或多個(gè)模板形參的實(shí)際類(lèi)型或?qū)嶋H值。i. 完全特化(函數(shù))templateint compare(const char* cosnt &v1,const char* const&v2)(類(lèi))template class Queueii. 類(lèi)模板部分特化template class Queue第17章 用于大型程序的工具1. 棧展開(kāi):用于描訴在查找catch捕獲拋出異常的函數(shù)過(guò)程。在進(jìn)入相應(yīng)catch之前,撤銷(xiāo)在異常之前構(gòu)造的局部對(duì)象。2.
41、 重新拋出:一個(gè)空的throw沒(méi)有指定表達(dá)式的throw。只有捕獲子句或者從catch直接或間接調(diào)用的函數(shù)中的重新拋出才有效,其效果是將接到的異常對(duì)象重新拋出。3. 捕獲所有異常的catch子句為catch(.)。如果catch(.)與其他catch子句結(jié)合使用,它必須是最后一個(gè),否則,任何跟在它后面的catch子句都將不能被匹配。4. 函數(shù)測(cè)試塊:為了處理來(lái)自構(gòu)造函數(shù)初始化的異常,必須將構(gòu)造函數(shù)編寫(xiě)為函數(shù)測(cè)試塊。 T:T() try : val(0),str(“ “) catch() 5. 資源分配即初始化:來(lái)封裝資源的分配和釋放,可以保證正確釋放資源。這一技術(shù)常稱(chēng)為“資源分配即初始化“,簡(jiǎn)
42、稱(chēng)RAII。6. auto_ptr類(lèi):一個(gè)庫(kù)類(lèi)模板,提供對(duì)動(dòng)態(tài)分配對(duì)象的異常安全的訪問(wèn)。不能將auto_ptr對(duì)象綁定到數(shù)組或變量指針(auto_ptr釋放資源,會(huì)破還該指針,一般新建一個(gè)指針給auto_ptr,如auto_ptr ap(new string(“test”)),auto_ptr對(duì)象的復(fù)制和賦值是破壞性操作:將對(duì)象的所有權(quán)從右操作數(shù)轉(zhuǎn)到左操作數(shù)。對(duì)auto_ptr對(duì)象進(jìn)行復(fù)制刪除左操作數(shù)中的對(duì)象,因此,不能將auto_ptr對(duì)象存儲(chǔ)在容器中。7. 異常說(shuō)明:用于函數(shù)聲明定義上,指出函數(shù)拋出什么(如果有)異常類(lèi)型。void print(string) throw (runtime_error)??樟斜肀硎竞瘮?shù)不拋出異常,沒(méi)有異常說(shuō)明的函數(shù)可以?huà)伋鋈魏萎惓?。派生?lèi)的異常說(shuō)明不能比基類(lèi)還多,不能增加異常拋出。
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國(guó)手機(jī)瀏覽器行業(yè)競(jìng)爭(zhēng)格局及投資盈利研究報(bào)告
- 2025至2030中國(guó)異丙醇行業(yè)前景動(dòng)態(tài)與需求趨勢(shì)研究報(bào)告
- 2025至2030中國(guó)工業(yè)抗菌劑行業(yè)應(yīng)用態(tài)勢(shì)與投資效益研究報(bào)告
- 2025至2030中國(guó)寵物醫(yī)療行業(yè)盈利預(yù)測(cè)與未來(lái)發(fā)展方向研究報(bào)告
- 2025至2030中國(guó)大米糖漿固體行業(yè)消費(fèi)狀況與競(jìng)爭(zhēng)前景研究報(bào)告
- 2025年軟考全景規(guī)劃的試題及答案
- 思維導(dǎo)圖在軟件開(kāi)發(fā)中的應(yīng)用的試題及答案
- 網(wǎng)絡(luò)監(jiān)控與故障排查試題及答案
- 2025年沉浸式戲劇創(chuàng)意產(chǎn)業(yè)園區(qū)設(shè)計(jì)與市場(chǎng)推廣策略研究報(bào)告
- Part1-2 Unit8 Green Earth課件-【中職專(zhuān)用】高一英語(yǔ)(高教版2021基礎(chǔ)模塊2)(2023修訂版)
- GA/T 2012-2023竊照專(zhuān)用器材鑒定技術(shù)規(guī)范
- 畢業(yè)生就業(yè)推薦表
- 自閉癥兒童融合教育鄧猛
- 超全QC管理流程圖
- 電氣自動(dòng)化技術(shù)專(zhuān)業(yè)人才需求崗位分析及崗位職責(zé)能力分析報(bào)告
- 化工廠“三劑”管理辦法
- 嬰幼兒配方奶粉常見(jiàn)問(wèn)題問(wèn)與答
- DB14T 2655-2023 公路鐵尾礦集料混凝土施工技術(shù)規(guī)程
- 電路(1)智慧樹(shù)知到答案章節(jié)測(cè)試2023年山東大學(xué)
- 2023年衡水市小升初英語(yǔ)考試模擬試題及答案解析
- 繼電保護(hù)裝置整定記錄
評(píng)論
0/150
提交評(píng)論