c++ 數據類型轉換: static_cast dynamic_cast reinterpret_cast const_cast

c++ 數據類型轉換: static_cast dynamic_cast reinterpret_cast const_cast

【版權聲明】轉載請注明出處?http://www.cnblogs.com/TenosDoIt/p/3175217.html

【目錄】

引言

static_cast 定義

dynamic_cast 定義

舉例:下行轉換(把基類的指針或引用轉換成子類表示)

舉例:上行轉換(把子類的指針或引用轉換成基類表示)

舉例: static_cast 用于基本類型之間、基本類型指針和空指針間的轉換

reinterpret_cast 定義

舉例:reinterpret_cast用法

const_cast 定義

舉例:const_cast用法

總結


?

c語言中我們經常使用類似于 int a =(int)3.14等這種強制類型轉換

標準c++的類型轉換符:static_cast 、dynamic_cast、 reindivter_cast、 const_cast, 以下分別介紹他們的用法以及舉例說明

以下代碼編譯運行環境:codeblock with gcc in win7(x64)

【1】static_cast?
用法:static_cast?< type-id > ( exdivssion )?

該運算符把exdivssion轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性。它主要有如下幾種用法:

①用于類層次結構中基類和子類之間指針或引用的轉換。

  進行上行轉換(把子類的指針或引用轉換成基類表示)是安全的;

  進行下行轉換(把基類指針或引用轉換成子類表示)時,由于沒有動態類型檢查,所以是不安全的。

②用于基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。

③把空指針轉換成目標類型的空指針。

④把任何類型的表達式轉換成void類型。

注意:static_cast?不能轉換掉exdivssion的const、volitale、或者__unaligned屬性。

msdn官方解釋:http://msdn.microsoft.com/en-us/library/c36yw7x9(v=vs.80).aspx

【2】dynamic_cast

用法:dynamic_cast < type-id > ( exdivssion )

該運算符把exdivssion轉換成type-id類型的對象。Type-id必須是類的指針、類的引用或者void *;

如果type-id是類指針類型,那么exdivssion也必須是一個指針,如果type-id是一個引用,那么exdivssion也必須是一個引用。

dynamic_cast主要用于類層次間的上行轉換和下行轉換,還可以用于類之間的交叉轉換。

在類層次間進行上行轉換時,dynamic_cast和static_cast?的效果是一樣的;

在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast?更安全。

msdn官方解釋:http://msdn.microsoft.com/en-us/library/cby9kycs(v=vs.80).aspx

?

舉例:下行轉換(把基類的指針或引用轉換成子類表示)

需要注意的是如果基類中不含虛函數,dynamic_cast 下行轉換編譯會出錯

復制代碼
 1 #include<iostream>2 using namespace std;3 4 class father5 {6 public:7     void fun1()8     {9         cout<<"this is father fun1 call\n";
10     }
11     virtual void fun()
12     {
13         cout<<"this is father fun call\n";
14     }
15 };
16 
17 class son: public father
18 {
19 public:
20     void fun2()
21     {
22         cout<<"this is son fun2 call\n";
23     }
24     void fun()
25     {
26         cout<<"this is the son fun call\n";
27     }
28     int k;
29 };
30 
31 int main()
32 {
33     father *pf, f;
34     son *ps, s;
35 
36     pf = &f;// 基類的指針指向基類對象
37     ps = static_cast<son *>(pf);//這種轉換是不安全的,行為是不確定的
38     if(ps != NULL)
39     {
40         ps->fun(); //在本文編譯環境下,執行父類的fun
41         //本文編譯環境下,一下語句可以執行
42         ps->fun2();
43         ps->k = 1;
44     }
45     ps = dynamic_cast<son *>(pf);//轉換后ps = NULL
46     if(ps == NULL)
47         cout<<"dynamic_cast: ps = NULL\n";
48     cout<<"-----------------------------------------------------------------\n";
49     pf = &s; //基類指針開始指向子類對象
50     //此時,兩種轉換都是安全的
51     ps = static_cast<son *>(pf);
52     if(ps != NULL)
53     {
54         ps->fun();
55         ps->fun2();
56         ps->k = 1;
57     }
58     ps = dynamic_cast<son *>(pf);//轉換后ps = NULL
59     if(ps != NULL)
60     {
61         ps->fun();
62         ps->fun2();
63         ps->k = 2;
64     }
65 }
復制代碼

結果:

舉例:上行轉換(把子類的指針或引用轉換成基類表示)

復制代碼
 1 //類定義同上2 int main()3 {4     father *pf, f;5     son *ps, s;6 7     ps = &s;// 子類的指針指向子類對象8     //此時兩種轉換都是安全的9     pf = static_cast<father *>(ps);
10     if(pf != NULL)
11     {
12         pf->fun();
13     }
14     pf = dynamic_cast<father *>(ps);
15     if(pf != NULL)
16     {
17         pf->fun();
18     }
19 
20 }
復制代碼

舉例: static_cast 用于基本類型之間、基本類型指針和空指針間的轉換(不能用于基本類型指針之間轉換)。

注意:基本類型由于表示數值范圍的不同,因此需要用戶保證轉換的安全。另外dynamic_cast不能用于此類轉換

復制代碼
 1 int main()2 {3     //基本類型間的轉換,需要用戶保證安全4     int a = 1000;5     char c = static_cast<char>(a);//不安全,1000超過了char的表示范圍6     cout<<c<<endl;//輸出空7     a = 49;8     c = static_cast<char>(a);//安全,輸出字符‘1’9     cout<<c<<endl;
10     //c = dynamic_cast<char>(a); 錯誤
11     cout<<"-----------------------------------------------------------------\n";
12     //void *和基本類型指針的轉換,需要用戶保證轉換安全
13     a = 49;
14     void *pv;
15     pv = &a;
16     int *pi = static_cast<int *>(pv);//void * 轉換為int *
17     cout<<*pi<<endl; //輸出49
18     //pi = dynamic_cast<int *>(pv); 錯誤
19     char *pc = static_cast<char *>(pv);//void *轉char*
20     cout<<*pc<<endl;//輸出字符‘1’
21     void *pv2 = static_cast<void *>(pc);// char * 轉void *
22     cout<<*((char *)pv2)<<endl;輸出字符‘1’
23 }
復制代碼

?

【3】reinterpret_cast

用法:reinterpret_cast<type-id> (exdivssion)

reinterpret_cast運算符是用來處理無關類型之間的轉換;它會產生一個新的值,這個值會有與原始參數(expressoin)有完全相同的比特位。按照reinterpret的字面意思“重新解釋”,即對數據的比特位重新解釋。

IBM的C++指南?里明確告訴了我們reinterpret_cast可以,或者說應該在什么地方用來作為轉換運算符:

  • 從指針類型到一個足夠大的整數類型
  • 從整數類型或者枚舉類型到指針類型
  • 從一個指向函數的指針到另一個不同類型的指向函數的指針
  • 從一個指向對象的指針到另一個不同類型的指向對象的指針
  • 從一個指向類函數成員的指針到另一個指向不同類型的函數成員的指針
  • 從一個指向類數據成員的指針到另一個指向不同類型的數據成員的指針

總結來說:reinterpret_cast用在任意指針(或引用)類型之間的轉換;以及指針與足夠大的整數類型之間的轉換;從整數類型(包括枚舉類型)到指針類型,無視大小。

注意:static_cast?不能轉換掉exdivssion的const、volitale、或者__unaligned屬性。

msdn官方解釋:http://msdn.microsoft.com/en-us/library/e0w9f63b(v=vs.80).aspx

舉例:reinterpret_cast用法

復制代碼
 1 int main()2 {3    int a = 49;4    int *pi = &a;5    char *pc = reinterpret_cast<char*>(pi);//int * 到char *,用戶自己安全6    cout<<*pc<<endl; //輸出字符"1"7    unsigned long b = reinterpret_cast<unsigned long>(pc);//char * 轉 unsigned long8    cout<<b<<endl;//輸出pc指向地址(即a的地址)對應的整數9    int *pi2 = reinterpret_cast<int *>(b);//unsigned long 轉 int*
10    cout<<*pi2<<endl; //輸出49
11 }
復制代碼

【4】const_cast?

用法:const_cast<type-id> (exdivssion)

該運算符用來修改類型的const、volatile、__unaligned屬性。除了const 、volatile、__unaligned修飾之外, type_id和exdivssion的類型是一樣的。

常量指針被轉化成非常量指針,并且仍然指向原來的對象;

常量引用被轉換成非常量引用,并且仍然指向原來的對象;常量對象被轉換成非常量對象。

msdn官方解釋:http://msdn.microsoft.com/en-us/library/bz6at95h(v=vs.80).aspx

舉例:const_cast用法

復制代碼
1 int main()
2 {
3    const int a = 100;
4    int *b = const_cast<int *>(&a);//const int * 轉int *
5    cout<<*b<<endl; //輸出100
6    cout<<&a<<" "<<b<<endl; //兩者值相同,表明b指向a的地址,只是const屬性變了
7 }
復制代碼


總結:

類指針或引用的上行轉換static_cast 和 dynamic_cast 都可以

類指針或引用的下行轉換用dynamic_cast并且判斷轉換后是否為空

基本數據類型之間的轉換用static_cast, 但是由于數值范圍的不同,需要用戶保證轉換的安全性

不同類型之間的指針或引用的轉換用reinterpret_cast,它的本質是對指向內存的比特位的重解釋

消除數據的const、volatile、__unaligned屬性,用const_cast

【版權聲明】轉載請注明出處?http://www.cnblogs.com/TenosDoIt/p/3175217.html

轉載于:https://www.cnblogs.com/glllvwcc/p/5051393.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286253.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286253.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286253.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言試題二十八之編寫函數function功能是:從字符中刪除指定的字符,同一字母的大、小寫按不同字符處理。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 編寫函數f…

日用有余!國產中科方德桌面操作系統初體驗

國產IT圈里最受關注的話題&#xff0c;除了芯片想必就是操作系統了。但真說起國產操作系統&#xff0c;大家是既熟悉又陌生&#xff0c;聽說過的多而真正使用過的少。而伴隨產業發展&#xff0c;市面上也涌現出眾多國產操作軟件&#xff0c;這些系統是否好用&#xff1f;能否滿…

面試經驗總結

8 transient是干嘛的 Java的serialization提供了一種持久化對象實例的機制。當持久化對象時&#xff0c;可能有一個特殊的對象數據成員&#xff0c;我們不想用 serialization機制來保存它。為了在一個特定對象的一個域上關閉serialization&#xff0c;可以在這個域前加上關鍵字…

【GIS風暴】ArcGIS柵格重采樣(Resample)方法詳解

Contents 1. 最鄰近法(Nearest Neighbor)2. 雙線性內插法(Bilinear Interpolation)3. 三次卷積法(Cubic Convolution)4. ArcGIS重采樣工具(Resample)柵格/影像數據進行配準或糾正、投影等幾何變換后,像元中心位置通常會發生變化,其在輸入柵格中的位置不一定是整數的行…

Unhandled event loop exception PermGen space

原來一直用eclipse3.5&#xff0c;最近嘗試升級到3.7和4.2&#xff0c;但不管是3.7還是4.2項目編譯過程中總提示“Unhandled event loop exception PermGen space”要求退出workspace&#xff0c;與原來3.5版本比較了一下eclipse.ini參數設置發現沒有差別&#xff0c;懷疑是公司…

C# RichTextBox 做簡單的HTML代碼編輯器 ---------利用WinApi修正左側顯示行號 誤差

說明&#xff1a;通過WinApi可以準確定準滾動位置。 //行號 生成顯示 這里rtbLineNum用的 RichTextBox&#xff0c;也可以用其它private void ShowLineNum(){rtbLineNum.Text "";//計算行高&#xff0c;行數int linesLength 0;var pFirst tbEditor.GetPositionFr…

Angular - - angular.element

angular.element 將DOM元素或者HTML字符串一包裝成一個jQuery元素。 格式&#xff1a;angular.element(element); element&#xff1a;包裝成jquery對象的html字符串或者dom元素 jqLite提供的方法&#xff1a; addClass()after()append()attr()bind() – 不支持命名空間,選擇器…

六、文章詳情顯示及點贊實現《iVX低代碼/無代碼個人博客制作》

注&#xff1a;iVX也有免費直播課《第八期直播課》 一、文章詳情實現 上一節我們已經完成了首頁的內容顯示&#xff0c;那么此時我們完成點擊后跳轉到詳情頁內容。 那么此時由于我們需要跳轉到詳情頁需要對應的數據ID&#xff0c;那么此時還需要給首頁的文章數據對象數組一個…

centos格式化xfs文件系統格式并設置自動啟動掛載磁盤

文章目錄 說明操作步驟 說明 非全方位資料&#xff0c;學習實踐而來&#xff0c;歡迎參考學習 操作步驟 要將 /dev/sdb1 分區快速格式化為 XFS 文件系統并設置開機自動掛載&#xff0c;可以按照以下步驟進行操作&#xff1a; 查看已連接的硬盤列表&#xff0c;主要是設備名稱…

System.CommandLine選項Option

前一篇簡單看了一下CommandLine命令的使用&#xff0c;其實在一個命令行工具中&#xff0c;還有一個重要的點&#xff0c;那就是選項——Option&#xff0c;選項是為命提供參數&#xff0c;就好像C#中方法&#xff0c;Command就像方法&#xff0c;Option就像方法的參數&#xf…

長尾關鍵詞如何優化

長尾關鍵詞流量占據全站流量的80%&#xff0c;這是根據御梵景觀后臺數據得出來的結論&#xff0c;千萬不要以為泛關鍵詞給網站帶來的流量大&#xff0c;打個比方花園設計一天帶100個 流量&#xff0c;但是花園設計案例帶10個&#xff0c;花園設計效果圖帶10個&#xff0c;花園設…

【ArcGIS風暴】ArcGIS10.6柵格計算器(Raster Calculator)用法詳解

擴展閱讀: 【ArcGIS風暴】ArcGIS 10.2柵格計算器實用公式大全(經典珍藏版) 【ArcGIS風暴】柵格計算器(Raster Calculator)運算出現錯誤問題及解決方案匯總 文章目錄 1. 柵格計算器簡介2. 柵格計算器用法3. 簡單算術運算4. 數學函數運算5. 空間分析函數運算1. 柵格計算器簡…

C語言試題二十九之編寫函數int function(int lim,int aa[max])求出小于或等于lim的所有素數并放在aa數組中,該函數返回所求的素數的個數。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 編寫函數i…

三、登錄頁制作《iVX低代碼/無代碼個人博客制作》

注&#xff1a;iVX也有免費直播課《第八期直播課》 一、登錄頁實現 本節需要做的登錄頁如下&#xff1a; 該頁面我們復習可以的值&#xff0c;首先設置整個頁面頁面的垂直和水平對其為居中&#xff0c;隨后一個容器包裹對應的登錄區域&#xff0c;此時我們創建一個頁面命名為…

Android ContentProvider支持跨進程數據共享與互斥、同步 雜談

在開發中&#xff0c;假如&#xff0c;A、B進程有部分信息需要同步&#xff0c;這個時候怎么處理呢&#xff1f;設想這么一個場景&#xff0c;有個業務復雜的Activity非常占用內存&#xff0c;并引發OOM&#xff0c;所以&#xff0c;想要把這個Activity放到單獨進程&#xff0c…

【C#控件詳解】對話框類控件(打開文件,保存文件,選擇字體和顏色)

在實際應用中,我們會用到各種各樣的對話框,如打開文件,保存文件,選擇字體和顏色等等。本文詳細講解C#中的顏色對話框、打開文件對話框、字體對話框、瀏覽文件夾對話框和保存文件對話框。 文章目錄 1. ColorDialog對話框2. FolderBrowserDialog對話框3. FontDialog對話框4. …

動物界的再生一個故事

豬月薪5千&#xff0c;打算用20萬建一個窩&#xff0c;老虎不允許&#xff0c;說私自建就是違章建筑&#xff0c;只允許向狼買。 狼是搞工程的&#xff0c;先用20萬賄賂老虎取得開發權&#xff0c;再用50萬元向老虎買這塊地&#xff0c; 花10萬元把豬圈蓋好&#xff0c;向豬要價…

C語言試題三十之請編寫函數function對長度位7個字符的字符串,除首尾字符外,將其余5個字符按ascii碼降序排列。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫函數…

基于.NetCore開發博客項目 StarBlog - (11) 實現訪問統計

系列文章基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客&#xff1f;基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目基于.NetCore開發博客項目 StarBlog - (3) 模型設計基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入基于.N…

【SPSS統計分析】SPSS19.0簡體中文版安裝教程(附SPSS19.0簡體中文版下載)

spss19.0中文版是一款專業數據統計軟件,受到各種社會學科的研究生、研究員的歡迎。軟件能夠對信息的采集、處理、分析進行全面評估和預測。spss19.0中文版新增加了廣義線性混合模型、自動線性模型、一個統計網頁入口portal和直復營銷direct marketing功能等。另外,IBM 針對SP…