為什麼最好以引用方式捕捉異常

2021-08-04 14:24:07 字數 640 閱讀 5330

捕捉異常的方式有三種:值傳遞、引用、指標

引用與值傳遞相比:

1.值傳遞會複製兩次,傳給catch時,丟擲時都會複製。引用只複製一次,效率大大提高。

2.值傳遞會帶來切割問題。當傳遞派生類物件給引數是基類物件的catch時,會導致切割,即派生類的派生類成員被切割,

只留基類的部分。

引用與指標相比:

1.丟擲指標時,不需要複製物件,只需複製指標,效率增加,但是,不能丟擲指向區域性物件的指標,因為函式呼叫完畢,區域性物件被

銷毀。2.丟擲指向堆物件的指標時,new完之後沒辦法delete,因為沒有辦法知道傳來的是全域性物件或者static 物件或者是堆上的物件,所以,delete or not delete這就成乙個問題了。

3.catch-by-pointer和語言本身建立起來的慣例有所矛盾。4個標準的異常:

<1>:bad_alloc 當operator new無法滿足記憶體需求時丟擲。

<2>:bad_cast 當對乙個物件實行向下轉換(dynamic_cast)失敗時丟擲。

<3>:bad_typeid 當dynamic_cast被實施與乙個null指標時丟擲。

<4>:bad_excepition 適用於未預期的異常情況。

綜上:引用是最好的選擇,它不會產生上述問題。

c 為什麼要引用

includeusing namespace std void fun int p int main int a 10 int q q a cout 我對這段程式的理解在fun函式中b的位址賦給p了,為什麼呼叫之後,q的位址不變。5.當形參和實參不是指標型別時,在該函式執行時,形參和實參是不同的變數...

以實踐的方式學習C 引用

1.第乙個例子 假設 int var1 224 存放var1的值224的記憶體位址是0x12abcdef則以下code int var2 var1 將var1的值複製給var2.int var2 var1 var2 是var1 的別名 var2是var1的引用 var1 var2 224,var1的...

手機為什麼以13開頭的?

大家都知道以前電信移動郵政還沒有分家阿,郵電資源是郵電部 現資訊產業部 統一排程的。在分配號段的時候,做了一些細緻的規劃,大體是這樣 10開頭,電信服務號碼,如103國際半自動 108國際對方付費 1000電信服務中心,1001聯通服務中心等等。11開頭,賦予特種服務號碼,如110匪警,111電信內...