<七>C++的四種類型轉換
阿新 • • 發佈:2022-11-30
C語言中我們使用 int a=(int) b;的方式強制轉換
C++提供了四種類型轉換方式
const_cast
把常量屬性去掉的一個轉換. const int a =10; int *p1=(int *)(&a);//C 語言 OK int *p2=const_cast<int *>(&a);//OK double *p3 =(double *) (&a)//c 語言中可以,p3的定址範圍變大,帶來風險 double *p4=const_cast<double *>(&a);//c++在編譯階段就提示錯誤 只用於去掉常量屬性的地方 int b=const_cast<int>(a);//NO ,ERROR const_carst<這裡必須是指標或者引用>
static_cast
能夠提供編譯器認為安全的型別轉換 90%使用場景是這個,這個用的是比較多的,幾乎能做任何型別轉換,但是是要譯器認為安全的型別轉換 int a=10; char b=static_cast<int>(a);//OK int *p=nullptr; short *b=static_cast<short *>(p) ; //c++ NO , 兩者之間沒有任何聯絡 double *b=static_cast<double *>(p) ;//C++ NO , 兩者之間沒有任何聯絡 double *b1=(double *)(p) ;//C語言 OK 基類和派生類之間可以使用 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語言 OK
類似於C語言的強制型別轉換
dynamic_cast
主要用著繼承結構中,可以支援RTTI型別識別的上下轉換
程式碼
#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 會檢查p指標是否指向的是一個B物件 //pb->vfptr->vftable ->RTTI資訊,如果dynamic_cast轉換成功 //返回 指向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; }