1. 程式人生 > >【C++】 四種強制型別轉換

【C++】 四種強制型別轉換

總 結

  去const屬性用const_cast。

  基本型別轉換用static_cast。

  多型類之間的型別轉換用daynamic_cast。

  不同型別的指標型別轉換用reinterpreter_cast。

static_cast

任何具有明確定義的型別轉換,只要不包含底層const,都可以使用static_cast; 注: 頂層const:表示指標本身是個常量。如:int *const p; 底層const:表示指標所指的物件是一個常量。如:int const *p;

const_cast

該運算子只能改變運算物件的底層const。
  1. #include<iostream>
  2. usingnamespace std;  
  3. int main()  
  4. {  
  5.     constchar *pc=" HDU";  
  6.     char *p=const_cast<char *>(pc);  
  7.     cout<<"hello"<<p<<endl;  
  8.     return 0;  
  9. }  
注:此處只能用const_cast,而不能用static_cast;

reinterpret_cast

通常為運算物件的位模式提供較低層次上的重新解釋。 注: 1、在指標之間轉換,將一個型別的指標轉換為另一個型別的指標,無關型別; 2、將指標值轉換為一個整型數,但不能用於非指標型別的轉換。
示例:
  1. #include<iostream>
  2. usingnamespace std;  
  3. int main()  
  4. {  
  5.     int a=10;  
  6.     int *i=&a;  
  7.     long pc=reinterpret_cast<long>(i);//把一個指標轉換為一個整數,即取出地址值
  8.     char *str=reinterpret_cast<char *>(i);//把int*轉換為char *(比int型小),無輸出
  9.     long *l=reinterpret_cast<long *>(i);//把int *轉換為long *(比int型大),取出地址值(即i值)輸出
  10.     cout<<*i<<endl;  
  11.     cout<<hex<<pc<<endl;  
  12.     cout<<i<<endl;  
  13.     cout<<"char:"<<str<<endl;  
  14.     cout<<l<<endl;  
  15.     return 0;  
  16. }  
輸出結果如下:

dynamic_cast

執行時型別識別(以區別以上三個均在編譯時識別),用於將基類的指標或引用安全地轉換成派生類的指標或引用。 對指標進行dynamic_cast,失敗返回null,成功返回正常cast後的物件指標; 
對引用進行dynamic_cast,失敗丟擲一個異常bad_cast,成功返回正常cast後的物件引用。  對於“向上轉換”(即派生類指標或引用型別轉換為其基類型別),無論是指標還是引用向上轉換都是安全地。 對於“向下轉型”有兩種情況: 一種是基類指標所指物件是派生類型別的,這種轉換是安全的; 另一種是基類指標所指物件為基類型別,在這種情況下dynamic_cast在執行時做檢查,轉換失敗,返回結果為0;
在引用上,dynamic_cast依舊是常用於“安全的向下轉型”。與指標一樣,引用的向下轉型也可以分為兩種情況,與指標不同的是,並不存在空引用,所以引用的dynamic_cast檢測失敗時會丟擲一個bad_cast異常。
示例如下:
  1. #include<iostream>
  2. usingnamespace std;  
  3. class Base  
  4. {  
  5. public:  
  6.   Base(){};  
  7.   virtualvoid Show(){cout<<"This is Base calss";}  
  8. };  
  9. class Derived:public Base  
  10. {  
  11. public:  
  12.   Derived(){};  
  13.   void Show(){cout<<"This is Derived class";}  
  14. };  
  15. int main()  
  16. {  
  17.     //這是第一種情況
  18.     Base* base = new Derived;  
  19.     if(Derived *der= dynamic_cast<Derived*>(base))  
  20.     {  
  21.         cout<<"第一種情況轉換成功"<<endl;  
  22.         der->Show();  
  23.         cout<<endl;  
  24.     }  
  25.     //這是第二種情況
  26.     Base * base1 = new Base;  
  27.     if(Derived *der1 = dynamic_cast<Derived*>(base1))  
  28.     {  
  29.         cout<<"第二種情況轉換成功"<<endl;  
  30.         der1->Show();  
  31.     }  
  32.     else
  33.     {  
  34.         cout<<"第二種情況轉換失敗"<<endl;  
  35.     }  
  36.     delete(base);  
  37.     delete(base1);  
  38.     return 0;  
  39. }  
執行結果如下:

相關推薦

C++強制型別轉換

強制型別轉換在有些地方起到了很大的作用,在看C++中的強制型別轉換時,我們首先看一下我們熟悉的C語言中的強制型別轉換。 一.C語言的強制型別轉換 C語言中強制型別轉換分為兩種: 隱式型別轉換(相似型別轉換,及相關型別的轉換,這裡和型別提升也優點相似) 顯示型別轉換(

C++ 強制型別轉換

總 結   去const屬性用const_cast。   基本型別轉換用static_cast。   多型類之間的型別轉換用daynamic_cast。   不同型別的指標型別轉換用reinterpreter_cast。 static_cast 任何具有明

C++ :強制型別轉換方式 以及const常量摺疊

  遇到的幾個問題: (1)reinterept_cast:Int和float不能轉換  :傳引用 (2)cons_cast:去掉const屬性,在編譯階段  const int num = 12;    *c++裡

c++中強制型別轉換(const_cast、static_cast應用最多)

c++動態型別轉換有四種const_cast、static_cast、dynamic_cast、reinterpreter_cast 前面兩個用的多,但是後面的針對其設計理念有許多其他的實現方法可達到同樣的效果 1. static_cast (1)用於基

C++11強制型別轉換

1、  static_cast: 功能:完成編譯器認可的隱式型別轉換。 格式type1 a; type2 b = staic_cast<type1>(a);將type1的型別轉化為type2的型別; 使用範圍: (1)基本資料型別之間的轉換,如int->d

c++面試經典問題-強制型別轉換

Static_cast和Dynamic_cast放在一起比較容易記,一動一靜 Static_cast是靜態轉換,也就是編譯時轉換,可以完成基礎型別的轉換,然後任意型別指標與void指標的轉換,還可以完成同一個繼承體系中型別的轉換。 Dynamic_cast是執行時

C++中的強制型別轉換的區別

使用標準C++的型別轉換符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。 1 static_cast 用法:static_cast < type-id > ( expression

C++小點之強制型別轉換

提問: 1.為什麼要搞出四種,用原先使用的那種不可以嗎? 答:因為強制型別轉換時是具有一定的風險的,這種風險包括(精度的損失 ,派生類與基類的一些轉換關係) 而且根據風險程度的不同導致的 bug 也會不同 ,再加上存在許多種型別之間的轉換 , 所以C

C++的強制轉換

C++的四種強制轉換         C++中的四種轉換,是一個老生常談的話題。但是對於初學者來說,該如何選擇哪種轉換方式仍然會有點困惑。而且我總是覺得“紙上得來終覺淺”,於是便“絕知此事要躬行”。於是利用閒暇時光,整理

C#轉換字元法、三元表示式、常量列舉結構和陣列

一、三種方法轉換字串變成數字 1.1.Parse的使用 這兩個使用結果一樣,當用戶輸入的數字轉換成我們想要的數字型別。 可以使用     Convert.ToInt32(""); 還可以使用  int.Parse("") 1.2.int.TryParse的使用

C++ 4強制型別轉換

C++的型別轉換符:static_cast、dynamic_cast、reinterpret_cast、和const_cast 形式:class_name <type>(expression) ,其中class_name為以上4種,type是轉換的

C#/.NET整數的三強制型別轉換(int)、Convert.ToInt32()、int.Parse()的區別總結

1.(int) 適合簡單資料型別之間的轉換,C#的預設整型是int32(不支援bool型)。 2. int.Parse(string sParameter) 是個建構函式,引數型別只支援string型別,Parse就是把String型別轉換成int,char,doubl

C++中強制轉換

一、簡介 C++中存在四種強制型別轉換,分別是static_cast 、const_cast 、 dynamic_cast 、reinterpret_cast 二、存在原因 我們直到在C語言中有強制型別轉換,可以轉換成合理的型別,那麼我們為什麼要在C+

css3--氣泡

table sts .com alt ant hover order eight 客服 在聊天的場景中,聊天內容需要用到氣泡修飾,如下圖。下面一一講解。 圖片式: 第一個樣式是京東客服,氣泡的圓角和鉤子都是用了圖片。使用了一個table組合成了一個圓角的框框。lm樣

sklearn評估尺度

摘自部落格:https://blog.csdn.net/Softdiamonds/article/details/80061191 在sklearn中包含四種評價尺度,分別為mean_squared_error、mean_absolute_error、explained_variance_sco

Hystrixfallback條件 例子

Hystrix會在以下四種情況下觸發fallback函式: 1.任務超過了"withExecutionTimeoutInMilliseconds"定義的超時時間; 2.任務丟擲了非HystrixBadRequestException的異常; 3.超過了執行緒池執行緒數目; 4.熔

C 經典抽象資料型別(ADT)之記憶體分配

C中的一些抽象資料型別(ADT)如連結串列、堆疊、佇列和樹等,連結串列已經在前幾篇博文有所討論,見: 後面的博文會相繼討論堆疊、佇列和樹的一些基本的相關知識! 下面記錄一個最基本的問題,記憶體分配問題: 所有的 ADT 都必須明確一個問題,如何獲取記憶體

更新WinRAR永久去廣告方法

四種WinRAR永久去廣告方法 Winrar官網下載地址 我的電腦是64位的 就以64位版本進行介紹 方法一: 用Spy++檢視廣告視窗類名 開啟x64dbg附加winrar.exe,執行至winrar.exe模組程式入口點。 RarReminder 右鍵

C語言中的強制型別轉換

先直接放程式吧,後面還有總結。 -------------------------------------------start----------------------------------------------- #include<stdio.h>#include<string

JAVA引用,強弱軟虛以及用到的場景

1、強引用(StrongReference)           強引用是使用最普遍的引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。如下:                                    1 Object o=new Objec