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++型別
- JS在if中的強制型別轉換JS型別
- 深入淺出說強制型別轉換型別
- Javascript基礎之-強制型別轉換(三)JavaScript型別
- Javascript基礎之-強制型別轉換(一)JavaScript型別
- JavaScript強制型別轉換的背後操作JavaScript型別
- javascript強制型別轉換與操作符JavaScript型別
- c++ 型別轉換C++型別
- C++ 常型別轉換C++型別
- 【C++】C++之型別轉換C++型別
- 強制型別轉換(int)、(int&)和(int*)的區別型別
- String.valueOf和強制型別轉換(String)的區別型別
- C++強制型別轉換:static_cast、dynamic_cast、const_cast、reinterpret_castC++型別AST
- C++ 型別轉換(conv.)C++型別
- C++ 動態型別轉換C++型別
- C++整理18_型別轉換_C++型別
- C++ 重解釋型別轉換C++型別
- 選擇is或者as操作符而不是做強制型別轉換型別
- C++型別轉換建構函式C++型別函式
- C++ 表示式中的型別轉換C++型別
- sql最佳化-錯誤強制型別轉換導致索引失效SQL型別索引
- c++ static_cast顯式型別轉換C++AST型別
- c++隱式型別轉換存在的陷阱C++型別
- 強制轉換檢視某個欄位為某個型別的sql型別SQL
- 第二天:識別符號、賦值、資料型別、格式符、常量、自動轉換、強制轉換。符號賦值資料型別
- 型別轉換型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- C++ const void * 型別轉換簡單測試C++型別
- 聊聊 C++ 中的四種型別轉換符C++型別
- 徹底理解c++的隱式型別轉換C++型別
- 資料型別,型別轉換資料型別
- c++的進位制轉換C++
- Day08——強制轉換
- Python做int()強制型別轉換的時候,小數是如何取捨的?Python型別