C++四种强制类型转换
提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
C++四種強制類型轉換
- 一、static_cast
- 二、dynamic_cast
- 三、const_cast
- 四、reinterpret_cast
一、static_cast
static_cast主要用于一種類型轉化成另外一種類型
主要用于:
1.用于類層次結構中基類和派生類之間指針或引用的轉換
上行轉化(把派生類的指針或引用轉換成基類表示)是安全的
下行轉化(把基類的指針或引用轉換成派生類表示)不安全,并不像dynamic_cast有檢測
2.用于基本類型的轉化,例如int轉化double
3.把空指針轉化成目標類型空指針
4.把任意類型轉化成void類型
二、dynamic_cast
首先dynamic_cast與其他三種強制類型轉換不同的點在與,它是在運行時類型檢查,而其他三種是在編譯時處理的,其次dynamic_cast不能用與基本類型數據的強制轉換
主要用于:
1.用于類層次結構中基類和派生類之間指針或引用的轉換,與static_cast不同的是,dynamic_cast轉換如果成功的話返回的是指向類的指針或引用,轉換失敗的話則會返回NULL。它會有一個安全措施,確保了安全性
2.使用dynamic_cast進行轉換的,基類中一定要有虛函數,否則編譯不通過。
PS: 基類中需要檢測有虛函數的原因:類中存在虛函數,就說明它有想要讓基類指針或引用指向派生類對象的情況,此時轉換才有意義。
三、const_cast
彌補了static_cast無法轉換const/volitale的不足,將expression的const/volitale屬性移除,僅限于底層const屬性.
需要注意的是:const_cast不是去除常量的const屬性,而是去除指向常量的指針或引用的屬性
舉個例子:
a是常量,所以無法改變它的值,const_cast只是改變指向常量指針的常量性,通過地址改變其值
但是出現以下的狀況,q指向地址和a的地址相同,*q改變了a的值,但是顯示出來卻是沒改變,一個猜想是可能是編譯器的問題,本質上是已經改變了,我們來通過調試來看一看。
通過調試我們發現確實是這樣,內存以及改了,但是顯示出來還是沒改的樣子
四、reinterpret_cast
reinterpret_cast 允許將任何指針轉換為任何其他指針類型。 也允許將任何整數類型轉換為任何指針類型以及反向轉換。
PS:
1.reinterpret_cast 運算符可用于 char* 到 int* 或 One_class* 到 Unrelated_class* 之類的轉換,這本身并不安全,但可以通過編譯;
2. reinterpret_cast 的本質作用是重新定義內存數據的解釋方式,而不進行任何二進制轉換。
總結
以上是生活随笔為你收集整理的C++四种强制类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都欢乐谷垂直上下的那个项目叫什么
- 下一篇: c/c++错题总结