1. 程式人生 > >c++中四種強制型別轉換(const_cast、static_cast應用最多)

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

c++動態型別轉換有四種const_cast、static_cast、dynamic_cast、reinterpreter_cast

前面兩個用的多,但是後面的針對其設計理念有許多其他的實現方法可達到同樣的效果

1. static_cast
(1)用於基本資料型別之間的轉換,如把int轉換為char,把int轉換成enum,但這種轉換的安全性需要開發者自己保證(這可以理解為保證資料的精度,即程式設計師能不能保證自己想要的程式安全),如在把int轉換為char時,如果char沒有足夠的位元位來存放int的值(int>127或int<-127時),那麼static_cast所做的只是簡單的截斷,及簡單地把int的低8位複製到char的8位中,並直接拋棄高位。
(2)把空指標轉換成目標型別的空指標
(3)把任何型別的表示式型別轉換成void型別
(4)用於類層次結構中父類和子類之間指標和引用的轉換。
對於以上第(4)點,存在兩種形式的轉換,即上行轉換(子類到父類)和下行轉換(父類到子類)。對於static_cast,上行轉換時安全的,而下行轉換時不安全的

,為什麼呢?因為static_cast的轉換時粗暴的,它僅根據型別轉換語句中提供的資訊(尖括號中的型別)來進行轉換,這種轉換方式對於上行轉換,由於子類總是包含父類的所有資料成員和函式成員,因此從子類轉換到父類的指標物件可以沒有任何顧慮的訪問其(指父類)的成員。而對於下行轉換為什麼不安全,是因為static_cast只是在編譯時進行型別堅持,沒有執行時的型別檢查。

一般時候static_cast用的比較多,且與const_cast結合使用可以在父子類間完成常量屬性與非常量屬性的相關轉換
類似這樣的:
const_cast

class Widget{
public:
    virtual
~Widget(){}; }; class SpecialWidget:public Widget{ }; void update(SpecialWidget *psw){}; int main() { Widget *pw1=new SpecialWidget();//編譯執行正常 Widget *pw2=new Widget();//編譯執行正常 Widget *pw; //編譯正常,執行異常 update(dynamic_cast<SpecialWidget*>(pw)); return 0; }
  • static_cast的一些用法及變形
class Base1{
virtual
void f(){} }; class Base2{}; class Derived:public Base1,public Base2{}; int main(int argc, char* argv[]) { Derived d,*pd; Base1 *b1=&d; //用法一 if((pd=dynamic_cast<Derived*>(b1))!=0){ cout<<"pd結果指標型別為:"<<typeid(pd).name()<<endl; } //用法二 Base2 *b2; if((b2=dynamic_cast<Base2*>(b1))!=0){ cout<<"b2結果指標型別為:"<<typeid(b2).name()<<endl; }

結果如下:

pd結果指標型別為:P7Derived
b2結果指標型別為:P5Base2

3. const_cast
const_cast目前基本只用在const的轉換上,基本無其他用法,比較單一

4. reinterpret_cast
reinterpret_cast的常用地方是轉換”函式指標”型別。
如下:

typedef void (*FuncPtr)(); //定義一個無引數且無返回值的函式指標
FuncPtr funcPtrArray[10];  //定義一個長度為10的陣列,陣列元素是函式指標型別
int doSomething(){  return 1;};//定義一個無參返回值為int的函式
int main()
{
//funcPtrArray[0]=&doSomething;  錯誤,函式型別不相符
funcPtrArray[0]=reinterpret_cast<FuncPtr>(&doSomething);//函式名就是一個地址,因此取地址符是可選的

但reinterpret_cast與編譯器平臺相關,因此不具有移植性,使用範圍也有限。
另外,倘若你用過的編譯器版本比較老,不支援上面這些新用法,其實還可以用巨集定義來實現強制型別轉換的功能。

相關推薦

c++強制型別轉換(const_caststatic_cast應用)

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

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

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

C++】強制型別轉換

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

C++】 強制型別轉換

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

C++11強制型別轉換

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

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

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

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

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

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

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

C++強制轉換

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

C++的強制轉換

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

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

Java引用型別(強虛)

為什麼需要不同的引用型別 從Java1.2開始,JVM開發團隊發現,單一的強引用型別,無法很好的管理物件在JVM裡面的生命週期,垃圾回收策略過於簡單,無法適用絕大多數場景。為了更好的管理物件的記憶體,更好的進行垃圾回收,JVM團隊擴充套件了引用型別,從最早的強引用型別增加到強、軟、弱、虛四個引用

C#程式設計基礎第十課:C#的常用資料型別轉換:隱式轉換顯式轉換Convert類轉換

知識點:型別轉換、數值型別間的轉換、隱式型別轉換、顯式型別轉換、數值型別和string型別的轉換、Convert類轉換。 1、資料型別型別轉換 理解:從根本上說是型別鑄造,或者說是把資料從一種型別轉換為另一種型別。C#有多種資料型別,在使用各種型別的資料時,有時候需要將一種型別的資料轉換

c#訪問修飾符說明

msdn的解釋如下:internal指的是同一個程式集,內部成員和型別才是可以訪問的.內部訪問通常用於基於元件的開發,因為它使一組元件能夠以私有方式進行合作,而不必嚮應用程式程式碼的其餘部分公開 一個成員或型別只能有一個訪問修飾符,使用 protectedinternal

C++4個與型別轉換相關的關鍵字

static_cast const_cast dynamic_cast reinterpret_cast 一.型別轉換     表示式是否合法取決於運算元的型別,而且合法的表示式其含義也由運算元型別決定。在C++中,某些型別之間存在相

java引用型別

 今天看程式碼,裡面有一個類java.lang.ref.SoftReference把小弟弄神了,試想一下,接觸java已經有3年了哇,連lang包下面的類都不瞭解,怎麼混。後來在網上查資料,感覺收穫頗多,現記錄如下。        物件的強、軟、弱和虛引用在JDK 1.2以

C++執行緒同步的方法

現在流行的程序執行緒同步互斥的控制機制,其實是由最原始最基本的4種方法實現的。由這4種方法組合優化就有了.Net和Java下靈活多變的,程式設計簡便的執行緒程序控制手段。     這4種方法具體定義如下 在《作業系統教程》ISBN 7-5053-6193-7 一書中能夠找到

C++將整數轉換成二進位制輸出的方法

看《程式設計之美》第二節的時候,它是定義的一個整型,然後取位。但是他的那個或運算子號好像寫錯了,寫成了異或符號“^”,應該是“|”。我就突然對二進位制的輸出感興趣了。想知道怎樣輸出二進位制。我們知道C++輸出十六進位制是cout〈〈hex〈〈 a;而八進位制是cout〈〈 ocx〈〈 a;二進位制則沒有預設的

C++進程或線程同步互斥的控制方法

實現 適合 begin 執行 als 零基礎 time 並發 多少 分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!http://www.captainbed.net 現在流行的進程線程同步互斥的控制機