c 中的強制轉換

2021-09-17 07:55:17 字數 2382 閱讀 8386

在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不是用於去掉指向常量的常量性,而是去掉指向常數物件的指標或引用的常量性,其去除常量性的物件必須為指標或引用

例如: 乙個錯誤的例子

const int a = 10;

const int *p =&a;

*p = 20; //編譯錯誤

int b = const_cast(a) //編譯錯誤

在這個例子中有兩個編譯錯誤,第乙個編譯錯誤是*p因為具有常量性,其值不能被修改的,另一處錯誤是const_cast強制轉換物件必須是指標或引用。而上面的是乙個變數,這是不允許的。

例如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"《在這個例子中我們定義了乙個函式,用於在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的強制轉換 type 其中,type為型別描述符,如int,float等。為表示式。經強制型別轉換運算子運算後,返回乙個具有type型別的數值,這種強制型別轉換操作並不改變運算元本身,運算後運算元本身未改變,例如 int nvar 0xab65 char cchar char nvar 上述強制型...

C 中的強制型別轉換

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

C 中的型別強制轉換

c 同時提供了四種新的強制轉型形式 通常稱為新風格的或 c 風格的強制轉型 const cast expression dynamic cast expression reinterpret cast expression static cast expression 每一種適用於特定的目的 dyn...