注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境:ubuntu 10.10
gcc版本:4.4.5
一、強制型別轉換
1)c方式的強制型別轉換
- (type)( expression )
- type ( expression )
typedef void(pf)(int);
struct point
;int v = 0x12345; //宣告乙個整型變數v,並賦值
pf* pf = (pf*)v; //v強制轉換為函式指標
char c = char(v); //轉換成char,資料會截斷
point* p = (point*)v; //轉換成結構體指標,賦值給p
程式設計實驗
粗暴的型別轉換
11-1.cpp
#include typedef void(pf)(int);
struct point
;int main()
操作:
1) g++ 11-1.cpp -o 11-1.out編譯正確,執行錯誤:
segmentation fault(core dumped)
分析:
給函式指標乙個變數位址,這屬於非法賦值,會導致執行出現段錯誤。
2)c方式強制型別轉換存在的問題
- 過於粗暴
*任意型別之間都可以進行轉換,編譯器很難判斷其正確性
- 難於定位
*在原始碼中無法快速定位所有使用強制型別轉換的語句
二、問題
強制型別轉換在實際工程中是很難完全避免的!如何進行更加安全可靠的轉換?
三、新式型別轉換
1)c++將強制型別轉換分為4種不同的型別:強制型別轉換
(都是關鍵字)
用法:***_cast(expression)
2)static_cast強制型別轉換
- 用於基本型別間的轉換 (int,double,float等)
- 不能用於基本型別指標間的轉換
- 用於有繼承關係類物件之間的轉換和類指標之間的轉換
3)const_cast強制型別轉換
- 用於去除變數的唯讀屬性(只去掉const,不能新增const,已測試)
- 強制轉換的目標型別必須是指標或引用**換條件)
4)reinterpret_cast強制型別轉換
- 用於指標型別間的強制轉換
- 用於整數和指標型別間的強制轉換(嵌入式)
5)dynamic_cast強制型別轉換(用於類指標間的轉換,還必須含有虛函式,繼承關係)
- 用於有繼承關係的類指標間的轉換
- 用於有交叉關係的類指標間的轉換
- 具有型別檢查的功能
- 需要虛函式的支援
多用於多型!
例項分析
新式型別轉化初探
11-2.cpp
#include void static_cast_demo()
void const_cast_demo()
void reinterpret_cast_demo()
void dynamic_cast_demo()
int main()
操作:
1) g++ 11-2.cpp -o 11-2.out編譯錯誤:
11-2.cpp:60:28: error: invalid static_cast from type 'int*' to type 'char*'
pc = static_cast(pi);
錯誤:從'int*'到'char*'屬於非法使用static_cast。
11-2.cpp:71:27: error: invalid use of const_cast with type 'int', which is
not a pointer, reference, nor a pointer-to-data-member type
int z = const_cast(x);
錯誤:用'int'屬於非法使用const_cast,它必須用來轉換指標,引用。
小結:
1)c方式的強制型別轉換
-過於粗暴
- 潛在的問題不易被發現
- 不易在**中定位
2)新式型別轉換以c++關鍵字的方式出現
- 編譯器能夠幫助檢查潛在的問題
- 非常方便的在**中定位
- 支援動態型別識別(dynamic_cast)
C 11 新型的型別轉換
include typedef void pf int struct point int main 輸出 無警告,無錯誤 段錯誤c 方式強制型別轉換存在的問題 問題 強制型別轉換在實際工程中是很完全難避免的!如何進行更加安全可靠的轉換呢?static cast const cast dynamic ...
新型型別轉換
c語言的強制型別轉換過於暴力,上百萬行的 中容易發生段錯誤,難以定位 static cast 用於基本型別間的轉換 不能用於基本型別指標間的轉換 用於有繼承關係類物件之間的轉換和類指標之間的轉換 void static cast demo const cast 用於去除變數的唯讀屬性 強制轉換的目標...
5 C 裡的4種新型型別轉換
1首先來回顧 c的強制轉換 大家都知道,在編譯 c語言中的強制轉換時 編譯器不會檢查轉換是否成功 都會編譯正確 比如 include stdio.h struct position int main 輸出結果如下圖所示 從上圖可以看到,只有當執行 時 才會出現段錯誤問題 當c 上千行時 若出現這種問...