1. 程式人生 > >C++11四種強制型別轉換

C++11四種強制型別轉換

1、  static_cast:
功能:完成編譯器認可的隱式型別轉換。
格式type1 a;
type2 b = staic_cast<type1>(a);將type1的型別轉化為type2的型別;
使用範圍:
(1)基本資料型別之間的轉換,如int->double;
int a = 6;
double b = static_cast<int>(a);
(2)派生體系中向上轉型:將派生類指標或引用轉化為基類指標或引用(向上轉型);
class base{       ….     }
class derived : public base{      ….     }
base *b;
derived *d = new derived();
b = static_cast<base *>(d);


2、  dynamic_cast
功能:執行派生類指標或引用與基類指標或引用之間的轉換。
格式:
(1)      其他三種都是編譯時完成的,dynamic_cast是執行時處理的,執行時要進行執行時型別檢查;
(2)      基類中要有虛擬函式,因為執行時型別檢查的型別資訊在虛擬函式表中,有虛擬函式才會有虛擬函式表;
(3)      可以實現向上轉型和向下轉型,前提是必須使用public或protected繼承;
例子:
向上轉型:
class base{       …      };
class derived : public base{      …      };
int main()
{
base *pb;
derived *pd = new derived();
pb = dynamic_cast<base *>(pd);
return 0;
}
向下轉型:
class base{       virtualvoid func(){}           };
class derived : public base{      void func(){}      };
int main()
{
base *pb = new base();
derived *pd = dynamic_cast<derived *>(pb);//向下轉型
return 0;
}
 
3、const_cast:
只能對指標或者引用去除或者新增const屬性,對於變數直接型別不能使用const_cast;不能用於不同型別之間的轉換,只能改變同種型別的const屬性。
如:
const int a= 0;
int b = const_cast<int>(a);//不對的
const int *pi = &a;
int * pii = const_cast<int *>pi;//去除指標中的常量性,也可以新增指標的常量性;
const_cast的用法:
(1)常用於函式的形參是一個非const的引用,我想要穿進去一個const的引用,可以使用const_cast<Type&>para;去除實參的常量性,以便函式能夠接受這個引數。
(2)一個const物件,我們想要呼叫該物件中的非const函式,可以使用const_cast去除物件的常量性;


4、reinterpret_cast:

從字面意思理解是一個“重新解釋的型別轉換”。也就是說對任意兩個型別之間的變數我們都可以個使用reinterpret_cast在他們之間相互轉換,無視型別資訊。

轉自:http://blog.csdn.net/bian_qing_quan11/article/details/70788312