C 型別轉換運算子

2022-09-10 15:27:20 字數 2777 閱讀 9349

關鍵字

說明static_cast

用於良性轉換,一般不會導致意外發生,風險很低。

const_cast

用於 const 與非 const、volatile 與非 volatile 之間的轉換。

reinterpret_cast

高度危險的轉換,這種轉換僅僅是對二進位制位重新解釋,是static_cast的互補

dynamic_cast

借助 rtti,用於型別安全的下行轉換。上行轉換與static_cast一樣。

該運算子可以進行良性型別轉換,轉換風險較低。它主要有如下幾種用途:

①用於基類(父類)和派生類(子類)之間指標或引用的轉換。

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

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

②用於基本資料型別之間的轉換,例如 short 轉 int、int 轉 double、int轉換成char等,這種轉換的安全性也要開發人員來保證。

③把空指標轉換成目標型別的空指標,例如 void * 轉 int *。

④把任何型別的表示式轉換成void型別, 例如 int 轉 void。

⑤無法將const、volatile、__unaligned屬性去掉

static_cast 沒有型別檢查來保證轉換的安全性,不能用於無關型別之間的轉換,例如:

static_cast 是在編譯期間轉換,轉換失敗的話會丟擲乙個編譯錯誤。

int m = 100

;long n = static_cast(m); //

寬轉換,沒有資訊丟失

char ch = static_cast(m); //

窄轉換,可能會丟失資訊

int *p1 = static_cast(malloc(10 * sizeof(int))); //

將void指標轉換為具體型別指標

void *p2 = static_cast(p1); //

將具體型別指標,轉換為void指標

//下面的用法是錯誤的

float *p3 = static_cast(p1); //

不能在兩個具體型別的指標之間進行轉換

p3 = static_cast(0x2df9); //

不能將整數轉換為指標型別

const_cast 就是用來將 const/volatile 型別轉換為非 const/volatile 型別。

const

int n = 100

;

int *p = const_cast(&n);

*p = 234

; cout

<< "

n =

" << n << endl; //

100 cout << "

*p =

" << *p << endl; //

234

&n用來獲取 n 的位址,它的型別為const int *,必須使用 const_cast 轉換為int *型別後才能賦值給 p。由於 p 指向了 n,並且 n 占用的是棧記憶體,有寫入許可權,所以可以通過 p 修改 n 的值。

由於 c++ 對常量的處理更像是編譯時期的#define,是乙個值替換的過程,**中所有使用 n 的地方在編譯期間就被替換成了 100。換句話說,第 4 行**被修改成了下面的形式:

cout << "

n =

"<< 100

<< endl; //

100

reinterpret_cast 僅僅是對二進位制位重新解釋,不會借助已有的轉換規則對資料進行調整。

reinterpret_cast 可以認為是 static_cast 的一種補充,一些 static_cast 不能完成的轉換,就可以用 reinterpret_cast 來完成,例如兩個具體型別指標之間的轉換、int 和指標之間的轉換。

//

將 char* 轉換為 float*

char str = "

";float *p1 = reinterpret_cast(str);

cout

<< *p1 << endl; //

3.0262e+29

//將 int 轉換為 int*

int *p = reinterpret_cast(100

); cout

<< *p << endl; //

100

dynamic_cast 用於在類的繼承層次之間進行型別轉換,它既允許上行轉換,也允許下行轉換。

dynamic_cast 與 static_cast 是相對的。dynamic_cast 會在程式執行期間借助 rtti 進行型別轉換,這就要求基類必須包含虛函式;static_cast 在編譯期間完成型別轉換,能夠更加及時地發現錯誤。

//

下行轉換

class

a private

:

intm_a;

};class b : public

a private

:

intm_b;

};class c : public

b private

:

intm_c;

};class d : public

c private

:

intm_d;

};int

main()

c 型別轉換運算子

c 中有4個型別轉換運算子,使裝換過程更規範 dynamic cast type name expression 如果轉型失敗則返回0,即空指標。該運算子的用途是,使得能夠在類層次結構中進行向上轉換 由於 is a關係,這樣的型別轉換時安全的 而不允許其他轉換。二 const cast const ...

C 型別轉換運算子

隱式轉換,是針對不同型別之間的賦值和運算,函式呼叫傳遞引數 這些的轉換都是由編譯器自動完成 char ch int i ch 顯式轉換 由程式設計師在變數前面新增型轉換 char pc char pb void ps void pa 通過上述的兩種方式,c語言大部分的型別轉換都可以順利進行,c 繼承...

C 型別轉換運算子

用於 指向派生類物件的 基類指標轉換成派生類指標。如果轉換失敗,則返回0,即空指標。通過判斷轉換是否成功,來決定是否用派生類裡的函式 基類中可能沒有那個函式 class a class b public a class c public b a a new a a b new b a c new c...