cstdlib
/stdlib.h
包含:std::abort()
可以向標準錯誤流cerr
發(fā)送消息abnormal program termination
, 然后終止程序.std::exit(...)
/exit(...)
刷新文件緩沖區(qū)而不顯示消息.try
表示注意該代碼塊引發(fā)的異常.throw
類似跳轉(zhuǎn), 常見的是throw "..."
.catch (type)
處理異常.throw
一個類對象 (直接構造函數(shù)形式throw classname(x, y, ...)
),catch
中調(diào)用對象接口函數(shù).noexcept
放在函數(shù)聲明后面表示不會引發(fā)異常.throw
完之后層層棧解退, 直到到達try
所在那層, 然后 “搜尋”catch
. 與此同時自動變量, 對象會相應析構.創(chuàng)新互聯(lián)公司服務項目包括金川網(wǎng)站建設、金川網(wǎng)站制作、金川網(wǎng)頁制作以及金川網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,金川網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到金川省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
throw
語句將控制權向上返回給第一個滿足如下條件的函數(shù): 包含能夠捕獲相應異常的try-catch
組合.
throw
自動生成副本, 但仍然建議在catch
中使用引用. 主要原因是可以執(zhí)行派生類對象.catch
塊的排列順序應和類的派生順序相反 (否則引用出問題).exception
包含exception
類, 用class classname: public std::exception
可以使用其中的what()
方法, 一般return
一個字符串.stdexcept
十分萬能:logic_error
系列domain_error
: 函數(shù)定義域.invalid_argument
: 傳遞的字符串出錯.length_error
: 空間不夠 (e.g.數(shù)組).out_of_bounds
: 索引無效.runtime_error
系列range_error
: 除了下面兩者的所有.overflow_error
: 超過變量類型大范圍.underflow_error
: 低于了浮點數(shù)最小表示值.bad_alloc
由exception
公有派生.std::nowthrow
,std::nothrow
.terminate()
函數(shù). (頭文件exception
)terminate()
默認調(diào)用abort()
函數(shù), 但可以通過set_terminate()
函數(shù)修改行為 (但必須包含一個需調(diào)用的函數(shù)).typedef void (*terminate_handler)();
terminate_handler set_terminate(terminate_handler f) throw();
terminate_handler set_terminate(terminate_handler f) noexcept;
void terminate();
void terminate() noexcept;
unexpected()
函數(shù). 可用set_unexpected
修改 (默認調(diào)用terminate
).new
進行內(nèi)存分配, 過早的終止會導致相應的delete
語句不被執(zhí)行, 導致內(nèi)存泄漏.解決方案:
- 在
catch
語句中加入相應的delete
語句.- (后文會提到) 智能指針模板.
Class1ptr* c1 = dynamic_cast(var)
: 只會告訴你轉(zhuǎn)換是否安全, 但不會告訴你具體是什么類型. 不安全返回空指針. 配合if
可以包含檢驗環(huán)節(jié).另外幾種常見的強制類型轉(zhuǎn)換:
static_cast
: 幾乎與dynamic_cast
相同, 但是沒有錯誤檢查機制. 同時dynamic_cast
能夠檢查形如 “A 同時派生了 B 和 C, B 與 C 之間的類型轉(zhuǎn)換 (返回nullptr
)”, 但static_cast
不行. 但static_cast
還允許枚舉類型和整型之間以及數(shù)值類型之間的轉(zhuǎn)換。注: 這兩種轉(zhuǎn)換在開發(fā)人員進行安全保證的情況下還可以脫離類來轉(zhuǎn)換 (
int ->char
, etc.).
reinterpret_cast
: “近乎萬能”, 不關心類的繼承關系.
const_cast
: 把常量指針 / 引用轉(zhuǎn)換為非常量指針 / 引用 (好處是確保了大部分時候的安全性).
typeid
(用到頭文件typeinfo
) 重載了運算符==
和!=
, 常見有:typeid(var1 / typename1) == typeid(var2 / typename2)
typeid(varname).name()
重要提示: 如果發(fā)現(xiàn)在擴展的
if else
語句中使用了typeid
, 則應考慮是否應該使用虛函數(shù)和dynamic_cast
.
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧