《C primer》 中 強制型別轉換

2021-06-21 23:09:44 字數 1532 閱讀 5482

命名的強制型別轉換符號一般形式如下:

cast-name(expression);

其中cast-name為static_cast,dynamic_cast,const_cast,reinterpret_cast之一,type為轉換目標,而expression為被強制型別轉換的值。強制轉換的型別指定了在expression上執行某種特定型別的轉換。

1.dynamic_cast

dynamic_cast支援執行時識別指標或者所指向的物件。

該運算子把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更安全。

2.const_cast

const_cast是將轉換掉表示式const的性質。例如,假設由函式string_copy,我們對其唯一的char*型別引數制度不寫,在訪問改函式時買最好的選擇是修改它讓它接受const char*型別的引數,如果不行,可通過const_cast用乙個const值呼叫string_copy函式:

const char *pc_str;

char *pc = string_copy(const_cast(pc_str));

只有使用const_cast才能將const性質轉換掉,在這種情況下,試圖使用其他三種形式的強制轉換都會導致編譯時的錯誤

3.static_cast

編譯器隱式執行額任何型別轉換都可以由static_cast顯式完成:

double d = 97.0;

char ch = static_cast(d);

當需要將乙個較大的算術型別賦值給較小的型別時,使用強制型別轉換非常有用。此時強制型別轉換將告訴編譯器:我們知道並且不關心潛在的精度損失。

如果編譯器不提供自動轉換,使用static_cast來執行型別轉換也是很有用的。例如,下面的程式使用static_cast找回存在在void*指標中的值:

void* p = &d;

double *dp = static_cast(p);

可以通過static_cast將存放在void*中的指標值強制轉換為原來的指標型別,此時我們應確保保持指標值,也就是說,強制型別轉換的結果應與原來的位址值相等。

4.reinterpret_cast

reinterpret_cast通常為運算元的位模式提供較低層次的重新解釋。

強制型別轉換 (c primer)

命名的強制型別轉換符號的一般形式如下 cast name expression 其中 cast name 為 static cast dynamic cast const cast 和reinterpret cast 之一,type 為轉換的目標型別,而 expression 則是被強制轉換的值。強...

matlab中強制型別轉換 型別轉換

上一期提到 隱式型別強制轉換 implicit type coercion 隱式型別強制轉換會造成意外。為了避免出現意外,c 提供了明式型別轉換,允許程式設計師通過使用型別轉換操作 cast operator 主動轉換資料的型別。型別轉換操作也可直接稱為型別轉換 type conversion ty...

C 中型別強制轉換

c 中有4種強制轉換 const cast,static cast,dynamic cast,reinterpret cast,以下將分別介紹 1.const cast 形式const cast expression 用來修改型別的const或volatile屬性,除了const或volatile修...