您好,登錄后才能下訂單哦!
#include <iostream> class A{ public: A(void){ std::cout << "A::A()" << std::endl; } ~A(void){ std::cout << "A::~A()" <<std::endl; } }; class B:public A{ public: B(void){ std::cout << "B::B(void)"<<std::endl; } ~B(void){ std::cout << "B::~B(void)" << std::endl; } }; void func(void){ throw A(); //這里拋出一個匿名A類對象. //這里調用A的構造函數,直接跳轉到},跳轉到"}",但是不執行匿名的析構函數 std::cout << "func()" << std::endl; //這里不執行 } int main(void){ try { //這里try 和catch都是一個局部作用域,和函數一樣 func();//直接跳轉到'}',但是從func函數里,拋出的異常對象的析構函數 //還是不調用 std::cout << "try" << std::endl; //不執行 } catch(A& ex){ //這里對異常拋出的異常對象進行捕捉,如果捕捉不到,則 //直接跳轉到下一個catch語句..., std::cout << "catch A"<<std::endl; return -1; }//這里執行匿名對象的析構函數 std::cout << "main endl..." <<std::endl; return 0; }
catch子句會根據異常的類型自上而下順序匹配,而不是最優匹配
catch子句中使用引用接受異常對象,避免拷貝構造的性能開銷,同時可以減少淺拷貝的風險
#include <iostream> class A{ public: A(){ std::cout << "A::A()" << std::endl; } ~A(){ std::cout << "A::~A()" << std::endl; } }; class B{ public: B(){ std::cout << "B::B()" << std::endl; } ~B(){ std::cout << "B::~B()" << std::endl; } }; class C{ public: C(){ std::cout << "C::C()" << std::endl; } ~C(){ std::cout << "C::~C()" << std::endl; } }; void func(void){ throw C();//調用C的構造函數,直接跳轉到'}' } int main(void){ try{ func();//直接跳轉到'}' } catch(int& ex){//這里發現int& ex = 匿名對象,不成立,則直接倒轉到轉到'}' std::cout << "catch:int" << std::endl;//不執行 } catch(B& ex){//B& ex =匿名對象,不成立,直接跳轉到'}' std::cout << "catch:B" << std::endl;//不執行 } catch(C& ex){//C& ex = 匿名對象,成立,則執行catch體內的語句 std::cout << "catch:C" << std::endl;//執行 }//這里調用匿名對象的析構函數 return 0; }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。