強制類型轉(zhuǎn)換
- C方式的強制類型轉(zhuǎn)換
- (Type)(Expression)
- Type (Expression)
發(fā)一個非常粗暴的轉(zhuǎn)換栗子:
typedef void(PF)(int);
struct Point
{
int x;
int y;
};
int v = 0x12345;
PF* pf = (PF*)v;
char c = char(v);
Point* p = (Point *)v;
- C方式強制類型轉(zhuǎn)換存在的問題
- 過于粗暴
- 任意類型之間都可以進(jìn)行轉(zhuǎn)換,編譯器很難判斷其正確性
- 難于定位
- 在源碼中無法快速定位所有使用強制類型轉(zhuǎn)換的語句
- 過于粗暴
新的類型轉(zhuǎn)換
- C++將強制類型轉(zhuǎn)換分為4種不同的類型
- static_cast
- const_cast
- dynamic_cast
- reinterpret_cast
用法: xxx_cast < Type > (Expression)
-
static_cast
強制類型轉(zhuǎn)換- 用于基本類型間的轉(zhuǎn)換
- 不能用于基本類型指針間的轉(zhuǎn)換
- 用于有繼承關(guān)系類對象之間的轉(zhuǎn)換和類指針之間的轉(zhuǎn)換
-
const_cast
強制類型轉(zhuǎn)換- 用于去除變量的只讀屬性
- 強制轉(zhuǎn)換的目標(biāo)類型必須是指針或引用
-
reinterpret_cast
強制類型轉(zhuǎn)換- 用于指針類型間的強制轉(zhuǎn)換
- 用于整數(shù)和指針類型間的強制轉(zhuǎn)換
-
dynamic_cast
強制類型轉(zhuǎn)換- 用于有繼承關(guān)系的類指針間的轉(zhuǎn)換
- 用于有交叉關(guān)系的類指針間的轉(zhuǎn)換
- 具有類型檢查的功能
- 需要虛函數(shù)的支持
舉一個栗子:
#include <stdio.h>
void static_cast_demo()
{
int i = 0x12345;
char c = 'c';
int* pi = &i;
char* pc = &c;
//可以正確轉(zhuǎn)換
c = static_cast<char>(i);
//不能正確轉(zhuǎn)換莺匠,因為static_cast只能用于基本類型間的轉(zhuǎn)換
pc = static_cast<char*>(pi);
}
void const_cast_demo()
{
const int& j = 1;
//可以正確轉(zhuǎn)換 因為是去除引用的const屬性
int& k = const_cast<int&>(j);
const int x = 2;
//可以正確轉(zhuǎn)換故俐,因為是去除引用的const屬性
int& y = const_cast<int&>(x);
//轉(zhuǎn)換錯誤括授,因為不能用于去除基本類型的const屬性
int z = const_cast<int>(x);
k = 5;
//輸出 5 5
printf("k = %d\n", k);
printf("j = %d\n", j);
y = 8;
//輸出 2 因為x是常量他挎,為了兼容c换衬,直接取的符號表中的值
printf("x = %d\n", x);
//輸出8
printf("y = %d\n", y);
//輸出2個一樣的地址
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;
//可以正確轉(zhuǎn)換模聋,是指針之間的轉(zhuǎn)換
pc = reinterpret_cast<char*>(pi);
//可以正確轉(zhuǎn)換减拭,是指針之間的轉(zhuǎn)換
pi = reinterpret_cast<int*>(pc);
//可以正確轉(zhuǎn)換鳄乏,因為是整數(shù)與指針之間的轉(zhuǎn)換
pi = reinterpret_cast<int*>(i);
//轉(zhuǎn)換錯誤跷车,因為是基本類型間的轉(zhuǎn)換
c = reinterpret_cast<char>(i);
}
void dynamic_cast_demo()
{
int i = 0;
int* pi = &i;
//轉(zhuǎn)換錯誤,類型不匹配
char* pc = dynamic_cast<char*>(pi);
}
int main()
{
static_cast_demo();
const_cast_demo();
reinterpret_cast_demo();
dynamic_cast_demo();
return 0;
}