日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

类型转换_异常处理机制

發布時間:2025/5/22 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 类型转换_异常处理机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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
可能有異常:

void divide(int x, int y) {if(y == 0)throw x; }//測試案例: try {divide(10,0); } catch(int e)cout<<"10除以"<< e << endl; // throw; //接到異常不處理 }

?

處理了異常,程序就不終止。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位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的类型转换_异常处理机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。