今天談談類型轉換的問題吧,之前我們也遇到過類型轉換,比如c語言中這樣的賦值:
顯然,i和j是不同類型的變量,但是卻可以完成賦值,結果是這樣的:
其實它們是做了隱式的類型轉換,相當于:double j = (double)i;所以成功的賦值。
還有另外一種:
結果是:
像這樣的,屬于顯示的類型轉換。
這樣類似的還有很多。下面我介紹c++中幾種特殊的類型轉換:
1、static_cast
static_cast用于相關類型的轉換(如int,double),屬于靜態轉換。
? ? ?比如:
結果:
2、reinterpret_cast(reinterpret:重新解釋的意思哈)
reinterpret_cast用于不相關類型的轉換。
比如例子1:
例子2:
結果:
像第二種這樣的例子,是對于函數而言,C++不保證所有的函數指針都被一樣的使用,所以這樣用有時會產生不
確定的結果。所以不建議這樣使用。
3、const_cast
const_cast是用于去掉常屬性的,方便賦值。
比如:
4、dynamic_cast
dynamic_cast用于將一個父類對象的指針或引用轉換為一個子類對象的指針或引用。
在這里,使用dynamic_cast,需要A類為多態類型。
dynamic_cast還有一個特點:
就在上述的代碼中,輸出pa,pb,可以看出:
· dynamic_cast會先檢查是否能轉換成功,能成功則轉換,不能則返回0
如果換做static_cast就不會檢查:
這也是dynamic_cast更安全的地方。
以上就是四種強制類型轉換方式。
下面說一個關鍵字explicit:(阻止隱式調用構造函數)
在這里,隱式調用了我們的構造函數,是因為這里的1比較特殊,所以可以調用成功,但是這種寫法本身是不對的。如果換做其他的或許就不行了。為了避免這樣的書寫,我們會在A()函數前加上關鍵字explicit。像這樣:
這下就編譯不過了,提高了代碼安全性。