日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++四种强制类型转换

發布時間:2023/11/30 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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屬性,而是去除指向常量的指針或引用的屬性
舉個例子:

int main() {const int a = 7;const int* p = &a;int* q = const_cast<int*>(p);*q = 20; //通過q寫值是未定義的行為printf("q=%d\n", *q);printf("a=%d\n", a);cout << "q=" << q << endl;cout << "a=" << &a << endl; }

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++四种强制类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。