国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++中的強(qiáng)制類型轉(zhuǎn)換const_cast

2019-11-06 07:30:10
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
C++提供了四個(gè)轉(zhuǎn)換運(yùn)算符:const_cast <new_type> (exPRession)static_cast <new_type> (expression)reinterpret_cast <new_type> (expression)dynamic_cast <new_type> (expression)它們有著相同的結(jié)構(gòu),看起來(lái)像是模板方法。這些方法就是提供給開(kāi)發(fā)者用來(lái)進(jìn)行指針和引用的轉(zhuǎn)換的。用法:const_cast<type_id> (expression)該運(yùn)算符用來(lái)修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類型是一樣的。一、常量指針被轉(zhuǎn)化成非常量指針,并且仍然指向原來(lái)的對(duì)象;二、常量引用被轉(zhuǎn)換成非常量引用,并且仍然指向原來(lái)的對(duì)象;type_id 必須為指針或引用static_cast < type-id > ( expression )說(shuō)明:該運(yùn)算符把expression轉(zhuǎn)換為type-id類型,但沒(méi)有運(yùn)行時(shí)類型檢查來(lái)保證轉(zhuǎn)換的安全性static_cast和reinterpret_cast的區(qū)別主要在于多重繼承,比如class A {    public:    int m_a;};class B {    public:    int m_b;};class C : public A, public B {};那么對(duì)于以下代碼:C c;printf("%p, %p, %p", &c, reinterpret_cast<B*>(&c), static_cast <B*>(&c));前兩個(gè)的輸出值是相同的,最后一個(gè)則會(huì)在原基礎(chǔ)上偏移4個(gè)字節(jié),這是因?yàn)閟tatic_cast計(jì)算了父子類指針轉(zhuǎn)換的偏移量,并將之轉(zhuǎn)換到正確的地址(c里面有m_a,m_b,轉(zhuǎn)換為B*指針后指到m_b處),而reinterpret_cast卻不會(huì)做這一層轉(zhuǎn)換。因此, 你需要謹(jǐn)慎使用 reinterpret_cast.dynamic_cast <type-id> (expression)該運(yùn)算符把expression轉(zhuǎn)換成type-id類型的對(duì)象。Type-id 必須是類的指針、類的引用或者void*;如果 type-id 是類指針類型,那么expression也必須是一個(gè)指針,如果 type-id 是一個(gè)引用,那么 expression 也必須是一個(gè)引用。dynamic_cast運(yùn)算符可以在執(zhí)行期決定真正的類型。如果 downcast 是安全的(也就說(shuō),如果基類指針或者引用確實(shí)指向一個(gè)派生類對(duì)象)這個(gè)運(yùn)算符會(huì)傳回適當(dāng)轉(zhuǎn)型過(guò)的指針。如果 downcast 不安全,這個(gè)運(yùn)算符會(huì)傳回空指針(也就是說(shuō),基類指針或者引用沒(méi)有指向一個(gè)派生類對(duì)象)。dynamic_cast主要用于類層次間的上行轉(zhuǎn)換和下行轉(zhuǎn)換,還可以用于類之間的交叉轉(zhuǎn)換。在類層次間進(jìn)行上行轉(zhuǎn)換時(shí),dynamic_cast和static_cast的效果是一樣的;在進(jìn)行下行轉(zhuǎn)換時(shí),dynamic_cast具有類型檢查的功能,比static_cast更安全。classB{public:int m_iNum;virtual void foo();};classD:publicB{public:char* m_szName[100];};void func(B* pb){D* pd1=static_cast<D*>(pb);D* pd2=dynamic_cast<D*>(pb);}在上面的代碼段中,如果 pb 指向一個(gè) D 類型的對(duì)象,pd1 和 pd2 是一樣的,并且對(duì)這兩個(gè)指針執(zhí)行 D 類型的任何操作都是安全的;但是,如果 pb 指向的是一個(gè) B 類型的對(duì)象,那么 pd1 將是一個(gè)指向該對(duì)象的指針,對(duì)它進(jìn)行 D 類型的操作將是不安全的(如訪問(wèn) m_szName),而 pd2 將是一個(gè)空指針。另外要注意:B 要有虛函數(shù),否則會(huì)編譯出錯(cuò);static_cast則沒(méi)有這個(gè)限制。這是由于運(yùn)行時(shí)類型檢查需要運(yùn)行時(shí)類型信息,而這個(gè)信息存儲(chǔ)在類的虛函數(shù)表中,只有定義了虛函數(shù)的類才有虛函數(shù)表,沒(méi)有定義虛函數(shù)的類是沒(méi)有虛函數(shù)表的。另外,dynamic_cast還支持交叉轉(zhuǎn)換(cross cast)。如下代碼所示:classA{public:intm_iNum;virtual void f(){}};class B:public A{};class D:public A{};void foo(){B*pb=newB;pb->m_iNum=100;//D*pd1=static_cast<D*>(pb);//compile errorD*pd2=dynamic_cast<D*>(pb);//pd2isNULLdelete pb;}在函數(shù)foo中,使用static_cast進(jìn)行轉(zhuǎn)換是不被允許的,將在編譯時(shí)出錯(cuò),而使用 dynamic_cast的轉(zhuǎn)換則是允許的,結(jié)果是空指針。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 大埔县| 延庆县| 焦作市| 江油市| 扶沟县| 大安市| 柯坪县| 吴江市| 那坡县| 富川| 多伦县| 昆山市| 大港区| 牡丹江市| 西乡县| 长武县| 岗巴县| 安多县| 利川市| 厦门市| 东海县| 南充市| 榆中县| 若羌县| 义马市| 海林市| 黔西县| 鄂伦春自治旗| 嫩江县| 桦川县| 铁力市| 新乐市| 渭源县| 察哈| 隆尧县| 河北区| 安福县| 临潭县| 方山县| 霍城县| 长白|