詳解C++中四種類(lèi)型的轉(zhuǎn)換
C語(yǔ)言中我們使用 int a=(int) b;的方式強(qiáng)制轉(zhuǎn)換
C++提供了四種類(lèi)型轉(zhuǎn)換方式
const_cast
把常量屬性去掉的一個(gè)轉(zhuǎn)換.
const int a =10; int *p1=(int *)(&a);//C 語(yǔ)言 OK int *p2=const_cast<int *>(&a);//OK ???????double *p3 =(double *) (&a)//c 語(yǔ)言中可以,p3的尋址范圍變大,帶來(lái)風(fēng)險(xiǎn) double *p4=const_cast<double *>(&a);//c++在編譯階段就提示錯(cuò)誤
只用于去掉常量屬性的地方
int b=const_cast<int>(a);//NO ,ERROR const_carst<這里必須是指針或者引用>
static_cast
能夠提供編譯器認(rèn)為安全的類(lèi)型轉(zhuǎn)換
90%使用場(chǎng)景是這個(gè),這個(gè)用的是比較多的,幾乎能做任何類(lèi)型轉(zhuǎn)換,但是是要譯器認(rèn)為安全的類(lèi)型轉(zhuǎn)換
int a=10; char b=static_cast<int>(a);//OK int *p=nullptr; short *b=static_cast<short *>(p) ; //c++ NO , 兩者之間沒(méi)有任何聯(lián)系 double *b=static_cast<double *>(p) ;//C++ NO , 兩者之間沒(méi)有任何聯(lián)系 double *b1=(double *)(p) ;//C語(yǔ)言 OK
基類(lèi)和派生類(lèi)之間可以使用 static_cast
reinterpret_cast
int *p=nullptr; short *b=reinterpret_cast<short *>(p) ; //c++ OK , double *b=reinterpret_cast<double *>(p) ;//C++ OK , double *b1=(double *)(p) ;//C語(yǔ)言 OK
類(lèi)似于C語(yǔ)言的強(qiáng)制類(lèi)型轉(zhuǎn)換
dynamic_cast
主要用著繼承結(jié)構(gòu)中,可以支持RTTI類(lèi)型識(shí)別的上下轉(zhuǎn)換
代碼
#include <iostream> using namespace std; class A{ public: void virtual function(){ cout<<"A function()"<<endl; } }; class B : public A{ public: void virtual function(){ cout<<"B function()"<<endl; } void virtual test(){ cout<<"B function()"<<endl; } }; class C : public A{ public: void virtual function(){ cout<<"C function()"<<endl; } }; class D : public A{ public: void virtual function(){ cout<<"D function()"<<endl; } }; void show(A * pa){ //dynamic_cast 會(huì)檢查p指針是否指向的是一個(gè)B對(duì)象 //pb->vfptr->vftable ->RTTI信息,如果dynamic_cast轉(zhuǎn)換成功 //返回 指向B的地址,否則返回nullptr B *pb =dynamic_cast<B *> pa; if(pb!=nullptr){ pb->test(); } else{ pa->function(); } } int main(){ B b; C c; D d; show(&b); show(&c); show(&d); return 0; }
到此這篇關(guān)于詳解C++中四種類(lèi)型的轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)C++類(lèi)型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或
相關(guān)文章
C++ 實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)的實(shí)例
這篇文章主要介紹了C++ 實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)的實(shí)例的相關(guān)資料,M*N的矩陣,矩陣中有效值的個(gè)數(shù)遠(yuǎn)小于無(wú)效值的個(gè)數(shù),且這些數(shù)據(jù)的分布沒(méi)有規(guī)律,需要的朋友可以參考下2017-07-07C++利用鏈表模板類(lèi)實(shí)現(xiàn)簡(jiǎn)易隊(duì)列
這篇文章主要為大家詳細(xì)介紹了C++利用鏈表模板類(lèi)實(shí)現(xiàn)一個(gè)簡(jiǎn)易隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12C語(yǔ)言超全面define預(yù)處理指令的使用說(shuō)明
C語(yǔ)言里可以用#define定義一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)常量。特點(diǎn)是:定義的標(biāo)識(shí)符不占內(nèi)存,只是一個(gè)臨時(shí)的符號(hào),預(yù)編譯后這個(gè)符號(hào)就不存在了,也不做類(lèi)型定義。預(yù)編譯又叫預(yù)處理2022-04-04C語(yǔ)言堆與二叉樹(shù)的順序結(jié)構(gòu)與實(shí)現(xiàn)
堆是計(jì)算機(jī)科學(xué)中一類(lèi)特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱(chēng),通常是一個(gè)可以被看做一棵完全二叉樹(shù)的數(shù)組對(duì)象。而堆排序是利用堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法。本文將詳細(xì)介紹堆與二叉樹(shù)的順序結(jié)構(gòu)與實(shí)現(xiàn),需要的可以參考一下2022-05-05