4 種 C++ 強制類型轉(zhuǎn)換,你都清楚嗎?
掃描二維碼
隨時隨地手機看文章
我們先來回憶以下,C 語言的強制類型轉(zhuǎn)換形式:
(type) expr;
這種舊式強制類型轉(zhuǎn)換從表現(xiàn)形式上來說不夠清晰明了,容易看漏,一旦轉(zhuǎn)換過程出現(xiàn)問題,追蹤起來也就更加困難。
為了解決以上問題,C++不僅兼容了C的強制轉(zhuǎn)換,來引入了新的轉(zhuǎn)換方法。
強制類型轉(zhuǎn)換的形式:
cast-name<type>(exper);
其中,type是轉(zhuǎn)換的目標(biāo)類型,exper是要轉(zhuǎn)換的值,cast-name 有以下四種:
-
static_cast
-
dynamic_cast
-
const_cast
-
reinterpret_cast
接下來,我們逐個進行分析。
1、static_cast
這里先介紹下頂層const和底層const的概念:
(1)頂層const,表示指針本身是常量,例如:
int *const p1 = &i;p1 = &j; //編譯報錯,不能修改p1指向++(*p1); //可以,可以修改p1所指向的值的內(nèi)容
(2)底層const,表示指針?biāo)傅膶ο笫且粋€常量,例如:
const int *p2 = &i;p2 = &j; //可以,可以修改p2的指向++(*p2); //編譯報錯,不能修改p2所指向的值的內(nèi)容
那么再來說說static_cast:任何具有明確定義的類型轉(zhuǎn)換,除了不包含底層const,都可以使用 static_cast。例如:
double d = 0.1;void* p = &d; double *dp = static_cast<double*>(p);
static_cast本質(zhì)上是傳統(tǒng)c語言強制轉(zhuǎn)換的替代品。
通常,該操作符用于非多態(tài)類型的轉(zhuǎn)換,任何標(biāo)準(zhǔn)轉(zhuǎn)換都可以使用它。
2、dynamic_cast
用于將基類指針或引用安全的轉(zhuǎn)換成派生類的指針或引用(運行時類型識別)。
dynamic_cast運算符的使用形式如下:
dynamic_cast(e) dynamic_cast(e) dynamic_cast(e)
其中,type必須是一個類類型,并且通常情況下該類型應(yīng)該含有虛函數(shù),在第一種形式中,e必須是有效指針;在第二種形式中,e必須是一個左值,在第三種形式中,e不能是左值。
如果轉(zhuǎn)換目標(biāo)是指針并且轉(zhuǎn)換失敗,則結(jié)果是0,如果轉(zhuǎn)換目標(biāo)是引用并且轉(zhuǎn)換失敗的,則會拋出異常。
因此,dynamic_cast操作符一次執(zhí)行兩個操作。首先驗證被請求的轉(zhuǎn)換是否有效,只有轉(zhuǎn)換有效,操作符才實際進行轉(zhuǎn)換。
3、const_cast
只能用于改變運算對象的底層const(去掉const屬性)
例:
const char *p1;char* p2 = const_cast<char*>(p1);
注意,我們?nèi)サ袅薱onst屬性,編譯器不會再阻止我們對該對象進行寫操作,但要注意,通過p2寫值是未定義行為。
4、reinterpret_cast
該操作符用于將一種類型轉(zhuǎn)換為另一種不同的類型,
比如可以把一個指針類型轉(zhuǎn)換為一個整數(shù),再把整數(shù)轉(zhuǎn)換為指針類型,并且還是原來那個指針。
“通常為運算對象的位模式提供較低層次上的重新解釋“,即是將變量以二進制形式被重新解釋為新的類型,這個操作本質(zhì)是依賴于機器的,也就是說,還需要考慮移植性。要想安全的使用reinterpret_cast,必須對涉及的類型和編譯器實現(xiàn)轉(zhuǎn)換的過程都非常了解。
reinterpret_casts 的最普通的用途,就是在函數(shù)指針類型之間進行轉(zhuǎn)換。
簡單總結(jié)
-
基本類型(非多態(tài))的轉(zhuǎn)換用static_cast。
-
多態(tài)類之間的類型轉(zhuǎn)換用dynamic_cast。
-
去掉const屬性用const_cast。
-
不同類型的指針類型轉(zhuǎn)換用reinterpreter_cast。(慎用)