1. 程式人生 > 其它 ><七>C++的四種類型轉換

<七>C++的四種類型轉換

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; 
        
}