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

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

C++四種類型轉(zhuǎn)換

2019-11-06 06:41:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

C風(fēng)格的強(qiáng)制類型轉(zhuǎn)換,格式如下兩種: *①Class(exPRession); ②(Class)expression;* 第一:不安全,沒(méi)有類型檢查; 第二:可讀性差,在代碼中不容易發(fā)現(xiàn)做了類型轉(zhuǎn)換。


C++的四類轉(zhuǎn)換:reinterpret_cast,const_cast,static_cast,dynamic_cast。分別對(duì)應(yīng)于不同的應(yīng)用場(chǎng)景。


static_cast 這里寫(xiě)圖片描述

void testStatic_Cast(){ // 基本類型的轉(zhuǎn)換 cout << "Begin of basic Type Cast--------------" << endl; char p = 'a'; cout << "p::" << p << endl; int i = static_cast<int>(p); cout << "i::" << i << endl; char q = static_cast<char>(i); cout << "q::" << q << endl; cout << "End of basic Type Cast--------------" << endl; // void*與別的指針類型之間的轉(zhuǎn)換 cout << "Begin of void* Type Cast--------------" << endl; int ii = 2; void* pvii = &ii; int* pii = static_cast<int*>(pvii); cout << ii << endl; cout << *pii << endl; cout << "End of void* Type Cast--------------" << endl; // 向上類型轉(zhuǎn)換(安全) cout << "Begin of Inherit Type Castcout--------------upcast" << endl; Child child2; Parent* parent2 = static_cast<Parent*>(&child2); parent2->sayHello(); parent2->setChildNum(2); cout << "Get Parent member::" << parent2->getChildNum() << endl; cout << "End of Inherit Type Castcout--------------upcast" << endl; // 向下類型轉(zhuǎn)換(不安全) cout << "Begin of Inherit Type Castcout--------------downcast" << endl; Parent parent1; Child* child1 = static_cast<Child*>(&parent1); /*child1->sayHello(); child1->sayDad(); child1->setChildNum(2); child1->setBrotherNum(3);*/ cout << "Get Parent member::" << child1->getChildNum() << endl; cout << "Get Child member::" << child1->getBrotherNum() << endl; cout << "End of Inherit Type Castcout--------------downcast" << endl;}

對(duì)于static_cast來(lái)講,對(duì)象指針的轉(zhuǎn)換,向上轉(zhuǎn)換是安全的,向下轉(zhuǎn)換則不安全。 運(yùn)行上面的代碼,向下轉(zhuǎn)換的時(shí)候代碼可以執(zhí)行,但執(zhí)行完以后會(huì)報(bào)錯(cuò)如下: 這里寫(xiě)圖片描述


const_cast 這里寫(xiě)圖片描述

#pragma onceclass ConstCastDemo{public: ConstCastDemo(void); ~ConstCastDemo(void); void setNum(int num); int getNum() const;private: int m_nNum;};#include "StdAfx.h"#include "ConstCastDemo.h"ConstCastDemo::ConstCastDemo(void) : m_nNum(0){}ConstCastDemo::~ConstCastDemo(void){}void ConstCastDemo::setNum(int num){ m_nNum = num;}int ConstCastDemo::getNum() const{ return m_nNum;}void testConst_Cast(){ const ConstCastDemo demo; cout << "Num from demo::" << demo.getNum() << endl; // 由于為const對(duì)象,所以不可執(zhí)行非const成員方法 // demo.setNum(100); // 不可以直接進(jìn)行對(duì)象的轉(zhuǎn)換(轉(zhuǎn)換后會(huì)成為另一個(gè)對(duì)象?) /*ConstCastDemo demo1 = const_cast<ConstCastDemo>(demo); demo1.setNum(100); cout << "Num from demo::" << demo.getNum() <<endl; cout << "Num from demo1::" << demo1.getNum() <<endl;*/ // 進(jìn)行指針的轉(zhuǎn)換,脫去const ConstCastDemo* demo2 = const_cast<ConstCastDemo*>(&demo); demo2->setNum(200); cout << "Num from demo::" << demo.getNum() << endl; cout << "Num from demo2::" << demo2->getNum() << endl; // 進(jìn)行引用的轉(zhuǎn)換,脫去const ConstCastDemo& demo3 = const_cast<ConstCastDemo&>(demo); demo3.setNum(300); cout << "Num from demo::" << demo.getNum() << endl; cout << "Num from demo3::" << demo3.getNum() << endl;}

dynamic_cast 這里寫(xiě)圖片描述

#pragma onceclass Parent{public: Parent(void); virtual ~Parent(void); void sayHello(); void setChildNum(int num); int getChildNum();private: int m_nChildNum;};#include "StdAfx.h"#include "Parent.h"#include <iostream>using namespace std;Parent::Parent(void){}Parent::~Parent(void){}void Parent::sayHello(){ cout << "Parent::say::" << "hello, boy!" << endl;}void Parent::setChildNum(int num){ m_nChildNum = num;}int Parent::getChildNum(){ return m_nChildNum;}#include "Parent.h"#pragma onceclass Child : public Parent{public: Child(void); virtual ~Child(void); void sayDad(); void setBrotherNum(int num); int getBrotherNum();private: int m_nBrotherNum;};#include <iostream>using namespace std;Child::Child(void) : Parent(){}Child::~Child(void){}void Child::sayDad(){ cout << "Child::say::" << "Hello, dad!" << endl;}void Child::setBrotherNum(int num){ m_nBrotherNum = num;}int Child::getBrotherNum(){ return m_nBrotherNum;}void testDynamic_Cast(){ /* ①dynamic_cast作用于類指針或者類引用; ②dynamic_cast用于向上轉(zhuǎn)換或者向下轉(zhuǎn)換; ③指針轉(zhuǎn)換的時(shí)候,如果失敗,返回NULL指針; ④引用轉(zhuǎn)換的時(shí)候,如果失敗,則跑出bad_cast異常; */ cout << "Begin to test dynamic_cast--------------Parent to Child" << endl; Parent* parent1 = new Parent(); Child* child1 = dynamic_cast<Child*>(parent1); if (child1 == NULL) { cout << "pointer dynamic_cast downcast failed!" << endl; } else { cout << "pointer dynamic_cast downcast succeed!" << endl; } /*Child& child2 = dynamic_cast<Child&>(*parent1);*/ Parent& parent2 = *parent1; try { Child& child2 = dynamic_cast<Child&>(parent2); cout << "reference dynamic_cast downcast succeed!" << endl; } catch (...) { cout << "reference dynamic_cast throw exception!" << endl; } cout << "End of test dynamic_cast--------------Parent to Child" << endl; cout << "Begin to test dynamic_cast--------------Child to Parent" << endl; Child* child3 = new Child(); Parent* parent3 = dynamic_cast<Parent*>(child3); if (parent3 == NULL) { cout << "pointer dynamic_cast upcast failed!" << endl; } else { cout << "pointer dynamic_cast upcast succeed!" << endl; } Child& child4 = *child3; try { Parent& parent4 = dynamic_cast<Parent&>(child4); cout << "reference dynamic_cast upcast succeed!" << endl; } catch (...) { cout << "reference dynamic_cast throw exception!" << endl; } cout << "End of test dynamic_cast--------------Child to Parent" << endl;}

reinpreter_cast 這里寫(xiě)圖片描述

謹(jǐn)慎使用reinpreter_cast!!!!


上一篇:C++ 工具

下一篇:C++異常處理機(jī)制

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 潢川县| 延川县| 兰溪市| 永清县| 广州市| 和平县| 类乌齐县| 贵德县| 留坝县| 玉溪市| 安新县| 林甸县| 海口市| 含山县| 德令哈市| 金山区| 阿坝县| 永宁县| 马边| 湖口县| 竹山县| 夹江县| 定安县| 天门市| 商河县| 兴山县| 濮阳县| 广饶县| 塔城市| 荥经县| 徐汇区| 江川县| 中阳县| 犍为县| 涿鹿县| 桃园县| 碌曲县| 香格里拉县| 英德市| 杭州市| 台东市|