C方式的強制類型轉換c++
(Type)(Expression) Type (Expression)
#include <stdio.h> typedef void(PF)(int); struct Point { int x; int y; }; int main() { int v = 0x12345; PF* pf = (PF*)v; char c = char(v); Point* p = (Point*)v; pf(5); printf("p->x = %d\n", p->x); printf("p->y = %d\n", p->y); return 0; }
C方式強制類型轉換存在的問題函數
C語言的強制類型轉換已經足夠簡單了,若是從語法上進行改進,產生的新的語言,必然沒辦法兼容原來的餘元,因此沒辦法直接改進強制類型轉換,必須提出新的辦法設計
C++在設計時,進行了強制類型轉換的功能上的劃分,分爲了4中不一樣的類型,產生了4個不一樣的關鍵字指針
static_cast
、cosnt_cast
、dynamic_cast
、reinterpret_cast
code
用法:xxx_cast<Type>(Expression)
對象
用關鍵字進行強制類型轉換,搜素關鍵字就能夠將全部用到強制類型轉換的地方所有搜索出來,方便定位繼承
static_cast
:靜態類型轉換用於基本類型間的轉換編譯器
不能用於基本類型指針間的轉換源碼
用於由繼承關係類對象之間的轉換和類指針之間的轉換io
cosnt_cast
:用於去除變量的只讀屬性
強制類型轉換的目標類型必須是指針或引用
reinterpret_cast
用於指針類型間的強制轉換
用於整數和指針類型間的強制轉換
dynamic_cast
用於由繼承關係的類指針間的轉換
用於由交叉關係的類指針間的轉換
具備類型檢查的功能
須要虛函數的支持
#include <stdio.h> void static_cast_demo() { int i = 0x12345; char c = 'c'; int* pi = &i; char* pc = &c; c = static_cast<char>(i); // 將i強制類型轉化爲char pc = static_cast<char*>(pi); // 整型轉 char * // err } void const_cast_demo() { const int& j = 1; // 只讀變量 int& k = const_cast<int&>(j); // 去除了只讀屬性 const int x = 2; // 常量 int& y = const_cast<int&>(x); // 不能去除常量的只讀屬性,可是會從新分配一個新的空間,y是別名 int z = const_cast<int>(x); // cosnt_cast只能用於指針或引用,目標類型爲int, err k = 5; printf("k = %d\n", k); printf("j = %d\n", j); y = 8; printf("x = %d\n", x); printf("y = %d\n", y); printf("&x = %p\n", &x); printf("&y = %p\n", &y); } void reinterpret_cast_demo() { int i = 0; char c = 'c'; int* pi = &i; char* pc = &c; pc = reinterpret_cast<char*>(pi); pi = reinterpret_cast<int*>(pc); pi = reinterpret_cast<int*>(i); c = reinterpret_cast<char>(i); // err, } void dynamic_cast_demo() { int i = 0; int* pi = &i; char* pc = dynamic_cast<char*>(pi); // 類指針之間,且要虛函數,故err } int main() { static_cast_demo(); const_cast_demo(); reinterpret_cast_demo(); dynamic_cast_demo(); return 0; }
C方式的強制類型轉換
- 粗暴
- 潛在的問題不容易發現
- 不易在代碼中定位
C++關鍵字方式的新式類型轉換
- 編譯器可以幫助檢查潛在的問題
- 很是方便地在代碼中定位
- 支持動態類型識別(
dynamic_cast
)