C 強制型別轉換

2021-07-26 16:33:45 字數 2241 閱讀 6813

在c++語言中新增了四個關鍵字static_cast、const_cast、reinterpret_cast和dynamic_cast。這四個關鍵字都是用於強制型別轉換的。我們逐一來介紹這四個關鍵字。

在c++語言中static_cast用於資料型別的強制轉換,強制將一種資料型別轉換為另一種資料型別。例如將整型資料轉換為浮點型資料。

[例1]c語言所採用的型別轉換方式:

int a = 10; int b = 3; double result = (double)a / (double)b;
例1中將整型變數a和b轉換為雙精度浮點型,然後相除。在c++語言中,我們可以採用static_cast關鍵字來進行強制型別轉換,如下所示。

[例2]static_cast關鍵字的使用:

int a = 10; int b = 3; double result = static_cast(a) / static_cast(b);
在本例中同樣是將整型變數a轉換為雙精度浮點型。採用static_cast進行強制資料型別轉換時,將想要轉換成的資料型別放到尖括號中,將待轉換的變數或表示式放在元括號中,其格式可以概括為如下形式:

static_cast 《型別說明符》 (變數或表示式)

在c語言中,const限定符通常被用來限定變數,用於表示該變數的值不能被修改。而const_cast則正是用於強制去掉這種不能被修改的常數特性,但需要特別注意的是const_cast不是用於去除變數的常量性,而是去除指向常數物件的指標或引用的常量性,其去除常量性的物件必須為指標或引用。

[例3]乙個錯誤的例子:

const int a = 10; const int * p = &a; *p = 20;                  //compile error int b = const_cast(a);  //compile error
在本例中出現了兩個編譯錯誤,第乙個編譯錯誤是*p因為具有常量性,其值是不能被修改的;另一處錯誤是const_cast強制轉換物件必須為指標或引用,而例3中為乙個變數,這是不允許的!

[例4]const_cast關鍵字的使用

#includeusing namespace std;  int main() ;     int val = 5;     int *p;     p = const_cast(search(a, 10, val));     if(p == null)         cout<<"not found the val in array a"《在例5中我們定義了乙個函式,用於在a陣列中尋找val值,如果找到了就返回該值的位址,如果沒有找到則返回null。函式search返回值是const指標,當我們在a陣列中找到了val值的時候,我們會返回val的位址,最關鍵的是a陣列在main函式中並不是const,因此即使我們去掉返回值的常量性有可能會造成a陣列被修改,但是這也依然是安全的。

對於引用,我們同樣能使用const_cast來強制去掉常量性,如例6所示。

例6:

#includeusing namespace std; const int & search(const int * a, int n, int val); int main() ; int val = 5; int &p = const_cast(search(a, 10, val)); if(p == null) cout<<"not found the val in array a"《了解了const_cast的使用場景後,可以知道使用const_cast通常是一種無奈之舉,同時也建議大家在今後的c++程式設計過程中一定不要利用const_cast去掉指標或引用的常量性並且去修改原始變數的數值,這是一種非常不好的行為。

在c++語言中,reinterpret_cast主要有三種強制轉換用途:改變指標或引用的型別、將指標或引用轉換為乙個足夠長度的整形、將整型轉換為指標或引用型別。在使用reinterpret_cast強制轉換過程僅僅只是位元位的拷貝,因此在使用過程中需要特別謹慎!

例7int *a = new int; double *d = reinterpret_cast(a);

在例7中,將整型指標通過reinterpret_cast強制轉換成了雙精度浮點型指標。

reinterpret_cast可以將指標或引用轉換為乙個足夠長度的整形,此中的足夠長度具體長度需要多少則取決於作業系統,如果是32位的作業系統,就需要4個位元組及以上的整型,如果是64位的作業系統則需要8個位元組及以上的整型。   

dynamic_cast用於類的繼承層次之間的強制型別轉換,我們將在講到類的繼承的時候再來介紹dynamic_cast。

C 強制型別轉換

四種型別可能很多人都常常忽略就象我一樣,但是有時還是比較有用的。不了解的建議看看,一些機制我也不是十分了解,只是將一些用法寫出來讓大家看看。強制轉化無論從語法還是語意上看,都是c 中最難看的特徵之一。但是基於c風格的轉化的語義的不明確性及其一些潛在問題。強制型別轉化最終還是被c 接受了。1.stat...

C 強制型別轉換

標準c 中主要有四種強制轉換型別運算子 const cast,reinterpret cast,static cast,dynamic cast等等。1 static cast a 將位址a轉換成型別t,t和a必須是指標 引用 算術型別或列舉型別。表示式static cast a a的值轉換為模板中...

C 強制型別轉換

關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast,dynamic cast,reint...