天天看點

顯式轉換類型函數詳解

在C++中顯式轉換類型的操作函數有static_cast,reinterpret_cast,const_cast和dynamic_cast,前面三個是在編譯時實作,後面一個dynamic_cast是在執行時實作,這些操作函數都是模闆函數,

static_cast<new_type>(expression)

reinterpret_cast<new_type>(expression)

const_cast<new_type>(expression)

dynamic_cast<new_type>(expression)

new_type是要轉變成的類型,expression是變量,轉變後傳回新類型的資料

1.reinterpret_cast<new_type>(expression)

該函數是将一個類型的指針轉換成另一種類型指針或者是一個整形數,注意expression是指針類型,不能轉變非指針變量,這種轉換不改變指針變量資料存放的格式.

double *a = 10;
int * b = reinterpret_cast<int*>(a); //相當于隐式轉換int *b = (int*)a;
long c  = reinterpret_cast<long>(a); //轉變為非指針變量

class A{};
class B{};
A *pA = new A;
B *pB = reinterpret_cast<B*>(pA); //轉換類指針

//不能用于非指針類型轉變
double a = 10;
int b = reinterpret_cast<int>(a); //錯誤的

//不能将const指針轉換為void*指針
const int * pa = new int;
void * pv = reinterpret_cast<void*>(pa); //錯誤
           

2.const_cast<new_type>(expression)

用于去除指針的常量屬性,轉換為同類型的非常量類型,也可以反過來,将非常量的指針轉換為同類型的常量指針,隻能對于指針類型!

const int *a = new int;
int *b = const_cast<int *>(a);
const int * c = const_cast<const int*>(b);

//對于非指針變量都無法通過編譯
const int a = 10;
int b  = const_cast<int>(a); //錯誤
int *c = const_cast<int*>(a); //錯誤
           

3.static_cast<new_type>(expression)

用于基本類型之間和具有繼承關系的類之間的轉換,這種轉換會改變變量的内部表示方式,也可以用于指針類型,但不必reinterpret_cast<>()效率高.

int a = 10;
double b = static_cast<double>(a);

class A{};
class B:public A{};
B b;
A a = static_cast<A>(b); //繼承的轉換
           

在轉換具有繼承關系的類對象是指針類型時,存在一定的危險

4.dynamic_cast<new_type>(expression)

這個是在執行的時候才進行類型轉換,與其他3個不同之一,隻能用于繼承類對象指針或引用之間進行類型轉換,以及沒有繼承關系的繼承類但被轉換類具有虛函數的對象進行轉換.

可以判斷轉換是否成功,對于指針,轉換失敗,則會傳回NULL指針,對于引用,轉換失敗,則會抛出bad_cast異常.

//對于具有繼承關系的
class A{};
class B:public A{};

A *a = new A;
B *b = dynamic_cast<B*>(a);
if(!b)
{
  cout<< "dynamic_cast轉換失敗" << endl;
}
else
{
  cout << "dynamic_cast轉換成功" << endl;
}

A a;
B &b = dyamic_cast<B &>(a); //引用轉換

class A {virtual void fun(){}};
class B{};
A *a = new A;
B *b = dynamic_cast<B*>(a);
//接着可以使用if語句判斷是否轉換成功