1. 程式人生 > >C++四種強制轉換

C++四種強制轉換

C++的四種強制型別轉換,所以C++不是型別安全的。分別為:static_cast , dynamic_cast , const_cast , reinterpret_cast

為什麼使用C風格的強制轉換可以把想要的任何東西轉換成合乎心意的型別。那為什麼還需要一個新的C++型別的強制轉換呢?

新型別的強制轉換可以提供更好的控制強制轉換過程,允許控制各種不同種類的強制轉換。C++中風格是static_cast<type>(content)。C++風格的強制轉換其他的好處是,它們能更清晰的表明它們要幹什麼。程式設計師只要掃一眼這樣的程式碼,就能立即知道一個強制轉換的目的。

四種轉換的區別:

static_cast:可以實現C++中內建基本資料型別之間的相互轉換。

1 int c=static_cast<int>(7.987);

如果涉及到類的話,static_cast只能在有相互聯絡的型別中進行相互轉換,不一定包含虛擬函式

class A {}; class B:public A {}; class C {}; int main() { A* a=new A; B* b; C* c;
b=static_cast<B>(a); // 編譯不會報錯, B類繼承A類 c=static_cast<B>(a); // 編譯報錯, C類與A類沒有任何關係 return 1; }

const_cast: const_cast操作不能在不同的種類間轉換。相反,它僅僅把一個它作用的表示式轉換成常量。它可以使一個本來不是const型別的資料轉換成const型別的,或者把const屬性去掉。

reinterpret_cast: 有著和C風格的強制轉換同樣的能力。它可以轉化任何內建的資料型別為其他任何的資料型別,也可以轉化任何指標型別為其他的型別。它甚至可以轉化內建的資料型別為指標,無須考慮型別安全或者常量的情形。不到萬不得已絕對不用。

dynamic_cast:

(1)其他三種都是編譯時完成的,dynamic_cast是執行時處理的,執行時要進行型別檢查。

(2)不能用於內建的基本資料型別的強制轉換。

(3)dynamic_cast轉換如果成功的話返回的是指向類的指標或引用,轉換失敗的話則會返回NULL。

(4)使用dynamic_cast進行轉換的,基類中一定要有虛擬函式,否則編譯不通過。

        B中需要檢測有虛擬函式的原因

        這是由於執行時型別檢查需要執行時型別資訊,而這個資訊儲存在類的虛擬函式表(關於虛擬函式表的概念,詳細可見<Inside c++ object model>)中,

        只有定義了虛擬函式的類才有虛擬函式表。

(5)在類的轉換時,在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的。在進行下行轉換時,dynamic_cast具有型別檢查的功能,比               static_cast更安全。向上轉換即為指向子類物件的向下轉換,即將父類指標轉化子類指標。向下轉換的成功與否還與將要轉換的型別有關,即要轉換的指標指向的物件的實際型別與轉換以後的物件型別一定要相同,否則轉換失敗。

參考例子:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

相關推薦

C++強制轉換

C++的四種強制型別轉換,所以C++不是型別安全的。分別為:static_cast , dynamic_cast , const_cast , reinterpret_cast 為什麼使用C風格的強制轉換可以把想要的任何東西轉換成合乎心意的型別。那為什麼還需要一個新的C++型別的強制轉換呢? 新型

C++ 強制轉換符的區別

作為四個內部型別轉換操作符之一的dynamic_cast和傳統的C風格的強制型別轉換有著巨大的差別。除了dynamic_cast以外的轉換,其行為的都是在編譯期就得以確定的,轉換是否成功,並不依賴被轉換的物件。而dynamic_cast則不然。在這裡,不再討論其他三種轉換和C風格的轉換。首先,dynamic

C++的強制轉換

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

C++中強制轉換

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

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

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

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

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

C++】強制型別轉換

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

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

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

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

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

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++小點之強制型別轉換

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

c++轉換

C++ 型別轉換(C風格的強制轉換): 在C++基本的資料型別中,可以分為四類:整型,浮點型,字元型,布林型。其中數值型包括 整型與浮點型;字元型即為char。 (1)將浮點型資料賦值給整型變數時,捨棄其小數部分。 (2)將整型資料賦值給浮點型變數時,數值不變,但是以指數形式儲存。

C++ 4強制型別轉換

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

C++種類型轉換

bin ++ 信息 {} pre 使用 屬性 四種 const 轉載:http://blog.csdn.net/bian_qing_quan11/article/details/70788312 1、 static_cast: 功能:完成編譯器認可的隱式類型轉換。 格式

C++同步手段

一,什麼是執行緒同步和互斥 同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。這裡的同步千萬不要理解成那個同時進行,應是指協同、協助、互相配合。執行緒同步是指多執行緒通過特定的設定(如互斥量,事件物件,臨界區)來控制執行緒之間的執行順序(即所謂的同步)也可以說是

C/C++ 結束執行緒方式詳解

一、四種方式     1、執行緒自然return返回。     2、呼叫 _endthreadex()函式或 ExitThread()函式。     3、在同一個程序的另一個執行緒中呼叫 TerminateThread()函式。     4、如果該執行緒位於某程序,

C++父類強制轉換為子類用法

-----Base.h #ifndef _BASE_H_ #define _BASE_H_ #include<iostream> using namespace std; class subclass; class base { public: int a;

C++ 種類型轉換操作符

一、C風格型別轉換操作符 (type) expression 例子: int firstNumber, secondNumber; double result = ((double)firstNumber)/secondNumber; 二、C++型別轉換操作符 1.s

C#父類強制轉換成子類,子類隱式轉換成父類

即Person p = new Student();  這種情況下可以把P物件強制轉換。你可能會問  這樣就是建立的一個student物件 我幹嘛不用student去建立? 這時候就是面向物件的程式設計的理解了。比如:我的一個方法的引數需要傳入一個學生,那麼你只能傳入一個student ,可是如果我的引數可