c++異常機制是建立在c之上的.
try類似與setjmp(),throw類似與longjmp(),catch則是longjmp()到原棧的判斷處理.
除去使用者的自定義型別,2種方法實現的功能是差不多的.
對,關鍵就在與使用者自定義型別.
對於內建變數,longjmp()後的值是否變化(還原)取決與變數儲存的位置:暫存器或者記憶體.
volatile,全域性,靜態變數在longjmp()後的值並不會恢復到setjmp()之前.區域性變數因為儲存在暫存器中(優化的情況下),可以不受longjmp()的影響.
c函式在這裡的缺陷是對於使用者型別不能準確析構.
c++中,throw和catch很象2個函式呼叫.
throw象是1個返回值物件的函式的內部**,而catch則更象1個函式.
有人說catch象函式呼叫,卻不是函式呼叫,因為它的傳參機制和函式呼叫不同.
比如這段**
void f()catch(excep &e){
執行一下,會呼叫一次copy建構函式.
"這裡的catch雖然引數為1個引用,但是事實上仍會呼叫e的copy建構函式".
這是確實的.
因為f()中的e是區域性物件,超出作用域後,catch中並不能以引用形式來使用這個已經被銷毀的物件.所以需要傳遞1個copy
給catch.這跟我們平時的直覺不同,因為引用作為引數一般是不需要傳遞copy的.
我感覺這種說法不是很好理解.我認為在這裡catch仍是按函式傳遞引用引數一樣,並沒有做是麼copy,而是在throw後(f結束前),copy就已經生成.就好象有個特定的位址,把異常都往這個位址上放(通過throw),然後catch以這個位址上的資料作為引數來使用.那麼這裡的throw就象是1個函式了.它的返回值就是這個位址,而它的返回方式顯然是按值返回.那麼,可以理解的是就象普通函式一樣,這裡的copy建構函式是因為區域性物件按值返回而生成的.
void f(){
throw excep();
改一下函式就會發現,這裡的函式就象1個函式的返回值優化,按值直接把異常物件放在返回的位址上.如果如此,那麼這裡就不需要呼叫copy建構函式,catch(execp &e)也只是象普通函式一樣從這個位址上取引數.
執行一下,這裡沒有呼叫copy建構函式.
返回值優化確實能夠很好的解釋這個問題.
vue傳參,元件之間傳參 路由傳參 vuex
詳見 兩種情況 params 和 query 都可以在目標元件的生命週期裡,通過 this.route 進行獲取 例 首頁中精選主題的路由傳參 精選主題 1 簡單舉例 a 一般會新建 store 資料夾,在 index.js 初始化 vuex b 在 main.js 中,引入 c 例如,在我的頁面修...
Vue 元件傳參知識點
很多時候用 emit攜帶引數傳出事件,並且又需要在父元件中使用自定義引數時,這時我們就無法接受到子元件傳出的引數了。找到了兩種方法可以同時新增自定義引數的方法。子元件傳出單個引數時 子元件傳參 this emit test this param 父元件接收 test test event,userd...
params傳參和query傳參
params傳參 this.router.push query傳參 this.router.push 1 用法上的 query要用path來引入,params要用name來引入,接收引數都是類似的,分別是this.route.query.name和this.route.params.name。注意接...