freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c++電子課件(下)第十章-文庫吧

2025-09-17 15:50 本頁面


【正文】 常的catch子句。 棧展開與異常捕獲 對(duì)應(yīng)在 throw表達(dá)式中,構(gòu)造拋出對(duì)象也要有實(shí)參: throw pushOnFull(data)。 //data即 Push(const amp。data)中的參數(shù) data template typename Tclass pushOnFull{ T _value。 public: pushOnFull(T i):_value(i){} //或?qū)憺?pushOnFull(T i){_value=i。} T value(){return _value。} }。 新的私有數(shù)據(jù)成員 _value保存那些 不能被壓入棧中的值 。該值 即 調(diào)用構(gòu)造函數(shù)時(shí)的 實(shí)參 。 catch子句異常聲明探討: 異常聲明中可以是一個(gè)對(duì)象聲明。以棧為例,當(dāng)棧滿時(shí),要求在異常對(duì)象中 保存不能被壓入到棧中的值 ,pushOnFull類可定義如下: 棧展開與異常捕獲 在 catch子句中 , 要取得 _value, 須調(diào)用 pushOnFull 中的成員函數(shù) value(): Catch(pushOnFullT eObj){ cerr”棧滿 ” ()”未壓入棧 ” endl。 return 1。} 在 catch子句的異常聲明中聲明了 對(duì)象 eObj,用它來調(diào)用pushOnFull類的對(duì)象成員函數(shù) value()。異常對(duì)象是在拋出點(diǎn)被創(chuàng)建,與 catch子句是否顯式要求創(chuàng)建一個(gè)異常對(duì)象無關(guān),該對(duì)象總是存在,在 catch子句中 只是為了調(diào)用異常處理對(duì)象的成員函數(shù)才聲明為對(duì)象,不用類 。 *catch子句異常聲明中采用對(duì)象只是一種 形式 。甚至異常并非一個(gè)類對(duì)象時(shí),也可以用同樣的格式,比如異常為一枚舉量,這時(shí)就等效于按值傳遞,而不是為了調(diào)用類對(duì)象的公有成員。 棧展開與異常捕獲 catch子句的異常聲明與函數(shù)參數(shù)聲明類似 , 可以是按值傳遞 , 也可以是按引用傳遞 。 對(duì)大型類對(duì)象減少不必要的復(fù)制是很有意義的 , 所以對(duì)于類類型的異常 ,其異常聲明最好也是被聲明為引用 。 如: catch(pushOnFullT amp。 eObj){ cerr”棧滿” ()”未壓棧” endl。 return 1。 } 使用引用類型的異常聲明, catch子句能夠修改異常對(duì)象,但僅僅是異常對(duì)象本身,正常程序部分的量并不會(huì)被修改。與一般類對(duì)象不同,實(shí)際上異常對(duì)象處理完后,生命期也就結(jié)束了。 只有需要重新拋出異常(在下一節(jié)中討論),修改操作才有意義。 【 例 】 包含棧滿或空異常的完整的程序。 棧展開與異常捕獲 把程序的正常處理代碼和異常處理代碼分離的最清楚的方法是定義函數(shù) try塊 ( Function try Block) 。 這種方法是把整個(gè)函數(shù)包括在 try塊中 。 一個(gè)函數(shù) try塊把一組 catch子句同一個(gè)函數(shù)體相關(guān)聯(lián) 。 如果函數(shù)體中的語句拋出一個(gè)異常 , 則考慮跟在函數(shù)體后面的處理代碼來處理該異常 。 函數(shù) try塊對(duì)構(gòu)造函數(shù)尤其有用 。 【 例 】 定義函數(shù) try塊( Function try Block)。 函數(shù) try塊的使用: 尋找匹配的 catch子句: 如果 throw表達(dá)式位于 try塊中,則檢查與 try塊相關(guān)聯(lián)的catch子句列表,看是否有匹配的子句能夠處理該異常; 如無匹配的 catch子句,則在主調(diào)函數(shù)中繼續(xù)查找。 如果函數(shù)調(diào)用在退出時(shí)帶有一個(gè)被拋出的異常未能處理,而且該調(diào)用位于一個(gè) try塊中,則檢查與該 try塊相關(guān)聯(lián)的catch子句列表,看是否有匹配的子句能處理該異常; 沒有,則查找過程 逆著嵌套的函數(shù)調(diào)用鏈 向上繼續(xù),直到找到能處理該異常的 catch子句。 只要遇到第一個(gè)匹配的catch子句,就會(huì)進(jìn)入該 catch子句進(jìn)行處理,查找結(jié)束。 如最終未找到匹配的字句,則由 terminate()處理。 棧展開與異常捕獲 在棧異常處理的例子中,對(duì) popOnEmpty,首先應(yīng)在istack的成員函數(shù) Pop()中找,因?yàn)?Pop()中沒有 try塊,不存在 catch子句,所以 Pop()帶著一個(gè)異常退出。下一步是檢查調(diào)用 Pop()的函數(shù),這里是 main(),在 main()中對(duì) Pop()的調(diào)用位于一個(gè) try塊中,則可用與該 try塊關(guān)聯(lián)的 catch子句列表中的某一個(gè)來處理,找到 第一個(gè) popOnEmpty類型異常聲明的 catch子句,并進(jìn)入該子句進(jìn)行異常處理。 棧展開: 因發(fā)生異常而逐步退出復(fù)合語句和函數(shù)定義的過程,被稱為 棧展開 (stack unwinding)— 異常處理的核心技術(shù)。 異常對(duì)程序的影響通常不僅是在發(fā)生異常的那個(gè)局部范圍中,而且可能逆調(diào)用鏈而上,甚至整個(gè)任務(wù)。因此, 異常處理應(yīng)該在其對(duì)程序影響的終結(jié)處進(jìn)行 ,甚至是在調(diào)用該任務(wù)的菜單處進(jìn)行。 棧展開與異常捕獲 在棧展開期間,在退出的域中有某個(gè) 局部量是類對(duì)象,棧展開過程將自動(dòng)調(diào)用該對(duì)象的析構(gòu)函數(shù) ,完成資源的釋放。 所以 C++異常處理過程本質(zhì)上反映的是 “ 資源獲取是由構(gòu)造函數(shù)實(shí)現(xiàn),而資源釋放是由析構(gòu)函數(shù)完成 ” 。采用面向?qū)ο蟮某绦蛟O(shè)計(jì),取得資源的動(dòng)作封裝在類的構(gòu)造函數(shù)中,釋放資源的動(dòng)作封裝在類的析構(gòu)函數(shù)中,當(dāng)一個(gè)函數(shù)帶著未處理的異常退出時(shí),函數(shù)中這種類對(duì)象被自動(dòng)銷毀,資源(包括動(dòng)態(tài)空間分配的資源和打開的文件)釋放。所以 由文件重構(gòu)對(duì)象應(yīng)該放在構(gòu)造函數(shù)中,把對(duì)象存入文件應(yīng)該放在析構(gòu)函數(shù)中 。 棧展開時(shí)資源的釋放 : 異常處理應(yīng)該用于面向?qū)ο蟮某绦蛟O(shè)計(jì)。對(duì)非面向?qū)ο蟮某绦蛟O(shè)計(jì)如果函數(shù)動(dòng)態(tài)獲得過資源,因異常,這些資源的釋放語句可能被忽略,則這些資源將永遠(yuǎn)不會(huì)被自動(dòng)釋放。 棧展開與異常捕獲 異常不能夠保持在未被處理的狀態(tài)。異常表示一個(gè)程序不能夠繼續(xù)正常執(zhí)行,這是非常嚴(yán)重的問題,如果沒有找到處理代碼,程序就調(diào)用 C++標(biāo)準(zhǔn)庫中定義的函數(shù) terminate()。 異常對(duì)象的探討: 異常對(duì)象是在 throw表達(dá)式中建立并拋出: throw表達(dá)式通過調(diào)用異常類的構(gòu)造函數(shù)創(chuàng)建一個(gè)臨時(shí)對(duì)象,然后把這個(gè)臨時(shí)對(duì)象復(fù)制到一個(gè)被稱為 異常對(duì)象( exception object)的存貯區(qū) 中,它保證會(huì)持續(xù)到異常被處理完。 棧展開與異常捕獲 函數(shù)調(diào)用和異常處理的區(qū)別:
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1