《C++Primer》5第五部分學(xué)習(xí)筆記匯總_高級主題(17章至18章)_第1頁
《C++Primer》5第五部分學(xué)習(xí)筆記匯總_高級主題(17章至18章)_第2頁
《C++Primer》5第五部分學(xué)習(xí)筆記匯總_高級主題(17章至18章)_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、C+ Primer第五部分學(xué)習(xí)筆記匯總一一高級主題C+ Primer第17章學(xué)習(xí)筆記第 17 章:用于大型程序的工具異常處理,命名空間,多重繼承與虛繼承學(xué)習(xí)摘錄 204:概念 大規(guī)模編程對程序設(shè)計語言的要求往往比小程序員團(tuán)隊更高。 1. 更嚴(yán)格的正常運轉(zhuǎn)時間以及更健壯的錯誤檢測和錯誤處理。 2. 能夠用各種庫(可能包含獨立開發(fā)的庫)構(gòu)造程序。 3. 能夠處理更復(fù)雜的應(yīng)用概念。第一節(jié):異常處理學(xué)習(xí)摘錄 205:異常處理的作用通過異常我們能夠?qū)栴}的檢測和問題的解決分離,這樣程序的問題檢測部分可以不必了解如何處理 問題。學(xué)習(xí)摘錄 206:拋出類型的異常異常是通過拋出(throw )對象而引發(fā)(ra

2、ise)的。被選中的處理代碼是調(diào)用鏈中與該對象類型匹配且 離拋出異常位置最近的那個。執(zhí)行 throw 的時候,不會執(zhí)行跟在 throw 后面的語句,而是將控制從 throw 轉(zhuǎn)移到匹配的 catch.學(xué)習(xí)摘錄 207:被拋出的對象被拋出的對象將會自動轉(zhuǎn)換為一個指針,不存在數(shù)組或函數(shù)類型的異常。如果拋出一個數(shù)組,被拋出的對象轉(zhuǎn)換為指向數(shù)組首元素的指針。如果拋出一個函數(shù),函數(shù)被轉(zhuǎn)換為指向該函數(shù)的指針。學(xué)習(xí)摘錄 208:異常對象在處理異常的時候,拋出異常的塊中的局部存儲不存在了。因為在處理異常的時候會釋放局部存儲,所以被拋出的對象就不能再局部存儲了,而是用throw表達(dá)式初始化一個稱為異常對象的特殊

3、對象。異常對象將傳給對應(yīng)的catch,并且在完全處理了異常之后撤銷。當(dāng)拋出一個表達(dá)式的時候,被拋出對象的解態(tài)編譯時類型將決定異常對象的類型。學(xué)習(xí)摘錄 209:異常與指針用拋出表達(dá)式拋出靜態(tài)類型時,比較麻煩的一種情況是,在拋出中對指針解引用。拋出指針的時候,必須確定進(jìn)入處理代碼時指針?biāo)赶虻膶ο蟠嬖凇H绻麙伋鲋赶蚓植繉ο蟮闹羔?,而且處理代碼在另一函數(shù)中,則執(zhí)行處理代碼時指針?biāo)赶虻膶ο髮?不再存在。拋出指針通常是個壞主意:拋出指針要求在對應(yīng)處理代碼存在的任意地方存在指針?biāo)赶虻膶ο?。學(xué)習(xí)摘錄 2 1 0:棧展開沿嵌套函數(shù)調(diào)用鏈接繼續(xù)向上,直至為異常找到一個catch子句,稱之為棧展開(stack

4、 unwinding )。拋出異常時,將暫停當(dāng)前函數(shù)的妨行,開始查找匹配的 catch 子句。首先檢查 throw 本身是否在 try 塊內(nèi)部如果找到匹配的catch,就處理異常如果找不到,就退出當(dāng)前函數(shù),并且繼續(xù)在調(diào)用函數(shù)中查找。 如果一個函數(shù)聲明沒有指定異常說明,則該函數(shù)可拋出任意類型的異常。學(xué)習(xí)摘錄 211:棧釋放資源 棧展開期間,釋放局部對象所用的內(nèi)存并運行類類型局部對象的析構(gòu)函數(shù)。如果一個塊直接分配資源,而且在釋放資源之前發(fā)生異常,在棧展開期間將不會釋放該資源。學(xué)習(xí)摘錄 212:析構(gòu)函數(shù)應(yīng)該從不拋出異常 在為某個異常進(jìn)行棧展開的時候,析構(gòu)函數(shù)如果又拋出自己的未經(jīng)處理的另一個異常,將導(dǎo)

5、致調(diào)用標(biāo) 準(zhǔn)庫 terminate 函數(shù)。一般而言, terminate 函數(shù)將調(diào)用 abort 函數(shù),強制從整個程序非正常退出。學(xué)習(xí)摘錄 213:異常與構(gòu)造函數(shù) 與析構(gòu)函數(shù)不同,構(gòu)造函數(shù)內(nèi)部所做的事情經(jīng)常會拋出異常。類似地,在初始化數(shù)組或其他容器類型的元素的時候,也可能發(fā)生異常,同樣,也要保證將會適當(dāng)?shù)?撤銷已構(gòu)造的元素。學(xué)習(xí)摘錄 214:捕獲異常catch子句(catch clause)中的異常說明符(exception specifier )是在其后跟一個(可選)形參名的類 型名。說明符的類型必須是內(nèi)置類型。在查找匹配的catch期間,找到的catch不必是與異常最匹配的那個catch,

6、相反,將先中第一個找到的可以處理該異常的 catch.學(xué)習(xí)摘錄 215:異常說明符與繼承如果被拋出的異對象是派生類類型的,但由接受基類類型的catch處理,那么,catch不能使用派生類特有的任何成員。通常,如果 catch子句處理因繼承而相關(guān)的類型的異常,它就應(yīng)該將自己的形參定義為引用。學(xué)習(xí)摘錄 216:重新拋出有可能單個 catch 不能完全處理一個異常。 catch 可以通過重新拋出將異常傳遞給函數(shù)調(diào)用鏈中更上層的函數(shù)。如果在處理代碼不活動時碰到空 throw ,就調(diào)用 terminate 函數(shù)。學(xué)習(xí)摘錄 217:捕獲所有異常的處理代碼若不知道可能被拋出的所有異常,可以使用捕獲所有異常c

7、atch子句(catch-all)的如果catch( 與其他catch子句結(jié)合使用,它必須是最后一個,否則,任何跟在它后面的catch子句都 將不能被匹配。學(xué)習(xí)摘錄 218:函數(shù)測試塊與構(gòu)造函數(shù)為了處理來自構(gòu)造函數(shù)初始化式的異常,必須將構(gòu)造函數(shù)編寫為函數(shù)測試塊(function try block )可以 使用函數(shù)測試塊將一組 catch 子句與函數(shù)聯(lián)成一個整體。 構(gòu)造函數(shù)要處理來自構(gòu)造函數(shù)初始化式的異常,唯一的方法是將構(gòu)造函數(shù)編寫為函數(shù)測試塊。學(xué)習(xí)摘錄 219 : auto_ptr 對象 auto_ptr 和內(nèi)置指針對待復(fù)制和賦值有非常關(guān)鍵的重要區(qū)別。當(dāng)復(fù)制 auto_ptr 對象或者將它的

8、值賦給其他 auto_ptr 對象的時候,將基礎(chǔ)對象的所有權(quán)從原來的 auto_ptr 對象轉(zhuǎn)給副本,原來的 auto_ptr 對象重置為未綁定狀態(tài)。學(xué)習(xí)摘錄 220 : auto_ptr 的缺陷 1. 不要使用 auto_ptr 對象保存指向靜態(tài)分配對象的指針。 2. 永遠(yuǎn)不要使用兩個 auto_ptr 對象指向同一對象。 3. 不要使用 auto_ptr 對象保存指向動態(tài)分配數(shù)組的指針。 4. 不要將 auto_ptr 對象存儲在容器中。第二節(jié):命名空間學(xué)習(xí)摘錄 221:命名空間的定義 命名空間可以在全局作用域或其他作用域內(nèi)部定義,但不能在函數(shù)或類內(nèi)部定義。命名空間名字后面接著由花括號括住

9、的一塊聲明和定義,可以在命名空間中放入可以出現(xiàn)在全局作用 域的任意聲明:類、變量、函數(shù)、模板以及其它命名空間。命名空間作域不能以分號結(jié)束。學(xué)習(xí)摘錄 222:命名是可以是不連續(xù)的 與其他作用域不同,命名空間可以在幾個部分中定義。命名空間由它的分離定義部分的部和構(gòu)成,命名空間的累積的。學(xué)習(xí)摘錄 223:全局命名空間( global namespace )定義在全局作用域的名字 (在任意類、 函數(shù)或命名空間外部聲明的名字) 是定義在全局命名空間中的。 全局命名空間是隱式聲明的,存在于每個程序中,在全局作用域定義實體的每個文件將那些名字加到 全局命名空間??梢杂米饔糜虿僮鞣萌置臻g的成員。 因

10、為全局命名空間是隱含的,它沒有名字,所有記號 :member_name 引用全局命名空間的成員。學(xué)習(xí)摘錄 224 :未命名的命名空間( unnamed namespace ) 未命名的命名空間與其他命名空間不同,未命名的命名空間的定義局部于特定文件,從不跨越多個文 本文件。學(xué)習(xí)摘錄 225:命名空間成員的使用除了在函數(shù)或其他作用域內(nèi)部,文件不應(yīng)該包含 using 指示或 using 聲明學(xué)習(xí)摘錄 226 :命名空間別名( namespace alias) namespace a = b; 此時 a 為 b 的別名。學(xué)習(xí)摘錄 227 :避免 using 指示 using 指示注入來自一個命名空間

11、的所有名字,它的使用是靠不住的。 如果應(yīng)用程序使用許多庫,并且用 using 指示使得這些庫中的名字可見,那么,全局命名空間污染問題 就會重新出現(xiàn)。相對于依賴于 using 指示,對程序中使用的每個命名空間名字使用 using 聲明更好,這樣做減少注入到 命名空間中的名字?jǐn)?shù)目, 由 using 聲明引起的二義性錯誤在聲明點而不是使用點檢測, 因此更容易發(fā)現(xiàn)和修 正。學(xué)習(xí)摘錄 228:虛繼承 在虛繼承下,對給定虛基類,無論該類在派生層次中作為虛基類出現(xiàn)多少次,只繼承一個共享的基類 子對象。共享的基類子對象稱為虛基類。class iostream: public virtual iosclass

12、; stream: virtual public ios; 無論虛基類出現(xiàn)在繼承層次中任何地方,總是在構(gòu)造非虛基類之前構(gòu)造虛基類。C+ Primer第18章學(xué)習(xí)筆記第 18 章:特殊工具與技術(shù)學(xué)習(xí)摘錄 229:operator new 函數(shù)和 operator delete 函數(shù) 0.使用 new 表達(dá)式時實際發(fā)生的三個步驟 1. 首先,該表達(dá)式調(diào)用名為 operator new 的標(biāo)準(zhǔn)庫函數(shù),分配足夠大的原始的未類型化的內(nèi)存,以保 存指定類型的一個對象; 2. 接下來,運行該類型的一個構(gòu)造函數(shù),用指定初始化式構(gòu)造對象; 3. 最后,返回指向新分配并構(gòu)造的對象的指針。 0.使用 delete

13、表達(dá)式時實際發(fā)生的兩個步驟 1. 首先,對指針指向的對象運行適當(dāng)?shù)奈鰳?gòu)函數(shù) 2. 然后,通過調(diào)用名為 operator delete 的標(biāo)準(zhǔn)庫函數(shù)釋放該對象所用內(nèi)存。 摘錄有想 229 :簡潔一點概括一下吧 new -> 分配內(nèi)存(給指定對象) -> 構(gòu)造對象 -> 返回對象指針 delete -> 指向?qū)ο?-> 釋放內(nèi)存學(xué)習(xí)摘錄 230:定位 new 表達(dá)式( placement new ) 它接受指向已分配但未構(gòu)造內(nèi)存的指針,并在該內(nèi)存中初始化一個對象。 new(place_address) type; new (place_address)type (initializer -list)學(xué)習(xí)摘錄 231 :一個內(nèi)存分配器基類預(yù)先分配一塊原始內(nèi)存來保存未構(gòu)造的對象, 創(chuàng)建新元素的

溫馨提示

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

評論

0/150

提交評論