类型转换_异常处理机制
C++四種類型轉換
static_cast
C++靜態類型轉換,c語言隱式類型可以轉換的,基本上都可以
//語法: type a = static_cast<type>(b); //b不為type類型reinterpret_cast
指針類型不可以這么轉化;指針需要強制類型轉換:
char* p1 = "hello"; int* p2 = NULL; p2 = reinterpret_cast<int*>(p1);dynamic_cast
用于繼承中多態時候的類型識別,在子類對象傳給父類指針后,可以對父類指針使用dynamic_cast進行向下類型轉換
Dog *pDog = dynamic_cast<Dog*>(base); if(pDog != NULL){轉換成功;
} const_cast
去除變量的只讀屬性(去除const屬性)
注意:實參是可讀可寫才行;
通過字符數組是在堆中分配內存空間;
而char*指向的字符串是字符串常量,不可改變。 void printBuf(const char* p) {char* p1 = NULL;p1 = const_cast<char*>(p);p1[0] = 'z'; //通過類型轉換就可以改變指針指向的內存空間的值 } char buf[] = "afdasdf"; //棧 中分配內存printBuf(buf); // okchar *my_p = "fsjljsf"; //字符常量,在 全局數據區 ,本身就不能改變;printBuf(my_p); //error
- 首先字符串是在靜態常量區分配的內存,然后指針my_p在棧里分配的內存,然后將指針指向”abacd”所在的內存塊。指針存放的是"fsjljsf"的地址,而這個地址所在內存是在靜態常量區中,是不可改變的。
- char buf[]數組是在棧中,數組棧中分配了內存,是局部變量,也就是說,由于char buf[]是分配了內存的,所以這里只是將"afdasdf"復制到char buf[]在棧中分配的內存中去,是可讀可寫的。這里就和指針區別出來了,指針是不分配內存的,指針指向的是一塊靜態常量區中的內存。?
發生異常后,跨函數,從throw直接到catch
可能有異常:
?
處理了異常,程序就不終止。catch到異常,但繼續拋出去,由程序自己報錯處理,或者其他catch處理
1、如有異常通過throw操作創建一個異常對象并拋擲;
2、將可能拋出異常的程序段放在try中。
3、try的保護段沒有異常,try后catch不執行,直到try后跟隨的隨后一個catch后面的語句繼續執行下去。
4、catch子句按照try后順序執行,捕獲或繼續拋出異常。
5、未找到匹配,函數terminate將被自動調用,其缺省功能即調用abort終止程序;
6、異常處理不了,通過最后一個catch,使用throw語法,向上仍。
重點:
構造函數沒有返回類型,無法通過返回值來報告運行狀態,所以只能通過一種非函數機制的途徑,
即:異常機制,來解決構造函數的出錯問題!!!
異常是嚴格按照類型匹配,不會隱式類型轉換
try {throw 'z'; } catch(int e) {cout << "捕獲int類型異常" << endl; } catch(...) {cout << "未知異常" << endl; }?
結論:
1、C++異常處理機制使得 異常引發 和 異常處理不必在同一個函數,
底層更注重解決具體問題,而不必過多考慮異常的處理,上層調用者可以
在適當位置設置 對不同類型異常的處理
2、異常時專門針對抽象編程中一系列錯誤處理的,C++不能借助函數機制,因為棧結構
先進后出,依次訪問,但異常處理要跳級處理,跨越函數
棧解旋:(重要)
異常被拋出后,從進入try起,到異常被拋擲前,這期間棧上的
構造的所有對象都會被自動析構,析構順序與構造相反
這一過程叫,棧解旋
異常變量的生命周期:
從try到異常拋擲前,其中的對象會自動析構。
三種類型: int char* 類對象
char*主要是 常字符串()全局數據區
拋出(無參)構造函數
throw Text(); //要加()
用 元素 來接 catch(Text e) //此時,調用拷貝構造函數,析構時,先析構拷貝出來的e,再執行返回的元素
用 引用 來接 catch(Text &e)//同一個元素
用 指針 來接 catch(Text *e) //接不到異常,因為拋出的是元素,異常機制嚴格按照類型匹配
異常的層次結構:繼承中的異常
類A中包含其他判斷len的類,類A的構造函數根據討論拋擲異常,即包含的那些類的構造函數。
這些類使用同一個基類size,catch時,使用類A的引用產生多態。
?
轉載于:https://www.cnblogs.com/Lunais/p/5852874.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的类型转换_异常处理机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: baron&nbsp;victo
- 下一篇: [大山中学模拟赛] 2016.9.10