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