C++強制型別轉換
******1、C風格
“()” 大法
C語言強轉比較簡單,只需要將想要轉換的型別名加到原型別變數名之前就可以了;
******2、C++風格
C++提供了4種新的強制型別轉換形式(通常稱為新風格的或C++風格的強制轉 型):const_cast(你要轉的型別)、dynamic_cast( )、 reinterpret_cast()和 static_cast(),每一種都適用於特定的目的,具體如下:
(1)dynamic_cast 主要用於執行“安全的向下轉型(safe downcasting)”,也就是說,要確定一個物件是否是一個繼承體系中的一個特定型別。支援父類指標到子類指標的轉換,這種轉換時最安全的轉換。它 是唯一不能用舊風格語法執行的強制型別轉換,也是唯一可能有重大執行時代價的強制轉換。
(2)static_cast 可以被用於強制隱形轉換(例如,non-const物件轉換為const物件,int轉型為double,等等),它還可以用於很多這樣的轉換的反向轉換 (例如,void*指標轉型為有型別指標,基類指標轉型為派生類指標),但是它不能將一個const物件轉型為non-const物件(只有 const_cast能做到),它最接近於C-style的轉換。應用到類的指標上,意思是說它允許子類型別的指標轉換為父類型別的指標(這是一個有效的隱式轉換),同時,也能夠執行相反動作:轉換父類為它的子類。
在此例中,被轉換的父類沒有被檢查是否與目的型別相一致。
程式碼:
class Base {
};
class Derived : public Base {
};
Base *a = new Base;
Derived *b = static_cast<Derived *>(a);
'static_cast’除了操作型別指標,也能用於執行型別定義的顯式的轉換,以及基礎型別之間的標準轉換:
程式碼:
double d = 3.14159265;
int i = static_cast(d);
執行結果: i = 3;
(3)const_cast一般用於強制消除物件的常量性。它是唯一能做到這一點的C++風格的強制轉型。這個轉換能剝離一個物件的const屬性,也就是說允許你對常量進行修改。
程式碼:
class Constant{
};
const Constant *a = new C;
Constant *b = const_cast<C *>(a);
此時的
(4)reinterpret_cast 是特意用於底層的強制轉型,導致實現依賴(就是說,不可移植)的結果,例如,將一個指標轉型為一個整數。這樣的強制型別在底層程式碼以外應該極為罕見。操作結果只是簡單的從一個指標到別的指標的值得二進位制拷貝。在型別之間指向的內容不做任何型別的檢查和轉換。
******3、兩者關係
舊風格的強制轉型依然合法(C語言風格),但是新的形式更可取。
例如:有的編譯器將不認同你所作的強制型別轉換而報錯(試圖使用一個const_cast以外的新風格 強制轉型來消除常量性,程式碼將無法編譯)
還有就是在程式碼的迭代中使開發者更容易識別,這樣就簡化了在程式碼中尋找型別系統被破壞的地方的過程;
相關文章
- C++ 的強制型別轉換C++型別
- C C++ 強制型別轉換C++型別
- c++四種強制型別轉換C++型別
- PHP 型別轉換&&型別強制轉換PHP型別
- 強制型別轉換型別
- java型別轉換與強制型別轉換(轉)Java型別
- 強制型別轉換之(==)型別
- C++ 中四種強制型別轉換的區別C++型別
- 造型與強制型別轉換型別
- JavaScript中的強制型別轉換JavaScript型別
- (十五)C++學習 | 強制型別轉換 異常處理C++型別
- 深入淺出說強制型別轉換型別
- JS在if中的強制型別轉換JS型別
- 引用型別變數的強制轉換型別變數
- C++開發必看四種強制型別轉換的總結C++型別
- javascript強制型別轉換與操作符JavaScript型別
- Javascript基礎之-強制型別轉換(三)JavaScript型別
- JavaScript強制型別轉換的背後操作JavaScript型別
- Javascript基礎之-強制型別轉換(一)JavaScript型別
- C++型別轉換C++型別
- c++ 型別轉換C++型別
- 強制型別轉換時的異常處理_java與c++比較型別JavaC++
- 強制型別轉換(int)、(int&)和(int*)的區別型別
- C++ 常型別轉換C++型別
- 【C++】C++之型別轉換C++型別
- C++中的向上型別轉換和向下型別轉換C++型別
- String.valueOf和強制型別轉換(String)的區別型別
- 再談c++型別轉換C++型別
- C++ 動態型別轉換C++型別
- C++基本資料型別及型別轉換C++資料型別
- 選擇is或者as操作符而不是做強制型別轉換型別
- C++ 型別轉換(conv.)C++型別
- C++隱式類型別轉換C++型別
- C++隱式型別的轉換C++型別
- C++ 隱式類型別轉換C++型別
- C++ 重解釋型別轉換C++型別
- C++整理18_型別轉換_C++型別
- swift 3.0:as語法與強制型別轉換的一些理解Swift型別