C 強制型別轉換

2021-10-01 23:49:54 字數 2061 閱讀 6037

一.強制型別轉換

c++語言中提供了static_cast、const_cast、reinterpret_cast和dynamic_cast。這四個關鍵字都是用於強制型別轉換的。 

二.static_cast

1.基本資料之間的轉換,如int轉化為double

int a = 1;

double b = static_cast(a);

2.用於類層次結構中基類和派生類之間指標或引用的轉換

①進行上行轉換(把派生類的指標或引用轉換成基類表示)是安全的

②進行下行轉換(把基類的指標或引用轉換為派生類表示),由於沒有動態型別檢查,所以是不安全的

//寫兩個類,假如 derive類繼承basic

basic *b = nullptr;

derive *d = new derive;

b = static_castd;

3.把空指標轉換成目標型別的空指標

int *p;

void *m = malloc(sizeof(int));

p = static_castm;

4.把任何型別的表示式轉換為void型別 

三.const_cast

cost_cast即用於強制轉換指標或者引用的const或volatile限制,特別注意的是,const_cast不是用於去除變數的常量性,而是去除指向常數物件的指標或引用的常量性,其去除常量性的物件必須為指標或引用。

//錯誤例子

const int a = 2;

int b = const_casta; //錯誤,const_cast強制轉換的物件必須是指標或引用

//正確例子

int c = 2;

const int *d = &c;

int *e = const_castd;

四.reinterpret_cast

reinterpret_cast運算子用於處理無關型別之間的轉換,他會產生乙個新的值,這個值會有與原始引數(原資料型別)有完全相同的位元位。1.從指標型別到乙個足夠大的整數型別

2.從整數型別或者列舉型別到指標型別

3.從乙個指向函式的指標到另乙個不同型別的指向函式的指標

4.從乙個指向物件的指標到另乙個不同型別的指向物件的指標

5.從乙個指向類函式成員的指標到另乙個指向不同型別的函式成員的指標

6.從乙個指向類資料成員的指標到另乙個指向不同型別的資料成員的指標

五.dynamic_cast

1.前面三種都是編譯時完成的強制轉換,dynamic_cast是執行時處理的。

2.不能用於內建的基本資料型別的強制轉換。

3.dynamic_cast轉換如果成功的話返回的是指向類的指標或引用,轉換失敗的話則會返回null。

4.使用dynamic_cast進行轉換的,基類中一定要有虛函式,否則編譯不通過。

5.在類的轉換時,在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的。在進行下行轉換時,dynamic_cast具有型別檢查的功能,比static_cast更安全。

使用dynamic_cast進行向下強制型別轉換。使用此關鍵字有以下幾個條件:

①.必須有虛函式

②.必須開啟編譯器的rtti開關

③.必須有繼承關係 

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...