C 中的各種cast

2021-06-08 11:57:03 字數 1843 閱讀 8319

先大體說一下(這段是自己胡說的):

static_cast -- 相當於隱式的型別轉換. 

dynamic_cast -- 主要用於類層次間的上行轉換和下行轉換(很透徹, 很精典)

reinterpret_cast

-- 最不安全的轉換, 可用於對映兩個完全不同的運算元

比較官方的:

static_cast執行非多型的轉換,用於代替c中通常的轉換操作

: 為運算元的位模式提供較低層的重新解釋

dynamic_cast

dynamic_cast < type-id > (expression)

該運算子把expression轉換成type-id型別的物件, type-id必須是類的指標、類的引用或者void*, 

如果type-id是類指標型別, 那麼expression也必須是乙個指標, 如果type-id是乙個引用, 那麼expression也必須是乙個引用.

dynamic_cast運算子可以在執行期決定真正的型別. 如果downcast是安全的(也就說, 如果基類指標或者引用確實指向乙個派生類物件)這個運算子會傳回適當轉型過的指標. 如果downcast不安全, 這個運算子會傳回空指標(也就是說, 基類指標或者引用沒有指向乙個派生類物件.

dynamic_cast主要用於類層次間的上行轉換和下行轉換, 還可以用於類之間的交叉轉換.

在類層次間進行上行轉換時, dynamic_cast和static_cast

的效果是一樣的.

在進行下行轉換時, dynamic_cast具有型別檢查的功能, 比static_cast更安全.

static_cast

static_cast < type-id > (expression)

該運算子把expression轉換為type-id型別, 但沒有執行時型別檢查來保證轉換的安全性. 它主要有如下幾種用法:

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

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

2. 用於基本資料型別之間的轉換, 如把int轉換成char, 把int轉換成enum. 這種轉換的安全性也要開發人員來保證

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

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

注: static_cast不能轉換掉expression的const、volatile、或者__unaligned屬性.

reinterpret_cast

static_cast和reinterpret_cast的區別:

c++primer第五章裡寫了編譯器隱式執行任何型別轉換都可由static_cast顯示完成, 而reinterpret_cast通常為運算元的位模式提供較低層的重新解釋. 具體來說:

1. c++中的static_cast執行非多型的轉換, 用於代替c中通常的轉換操作. 因此, 被做為隱式型別轉換使用. 比如:

int i;

float f = 166.71;

i = static_cast(f);

此時結果,i的值為166。

2. c++中的reinterpret_cast主要是將資料從一種型別的轉換為另一種型別. 所謂「通常為運算元的位模式提供較低層的重新解釋」也就是說將資料以二進位制存在形式的重新解釋. 比如:

int i;

char *p = "this is a example.";

i = reinterpret_cast(p);

此時結果, i與p的值是完全相同的, reinterpret_cast的作用是說將指標p的值以二進位制(位模式)的方式被解釋為整型, 並賦給i.

C 中的 cast(顯式型別轉換)

c 引入了 const cast,reinterpret cast 之類的新的顯式型別轉換方式,不僅大多數 c 程式設計師覺得不是很習慣,就連某些有經驗的c 程式設計師都會在一些細節上犯錯。誠然,既然我們可以簡單的寫出 int i int p p is a pointer 這樣的顯式轉換,為什麼還要...

sql中的cast函式

一 語法 cast expression as data type 引數說明 expression 任何有效的sqserver表示式。as 用於分隔兩個引數,在as之前的是要處理的資料,在as之後是要轉換的資料型別。data type 目標系統所提供的資料型別,包括bigint和sql varian...

sqlserver中的CAST 函式

語法 cast expression as data type 引數說明 expression 任何有效的sqserver表示式。as 用於分隔兩個引數,在as之前的是要處理的資料,在as之後是要轉換的資料型別。data type 目標系統所提供的資料型別,包括bigint和sql variant,...