C++簡明講解類型轉(zhuǎn)換的使用與作用
一、C語言中的強(qiáng)制類型轉(zhuǎn)換
轉(zhuǎn)換的語法如下:
(Type) (Expression)
Type(Expression)
下面看一段C語言中粗暴的類型轉(zhuǎn)換的代碼:
#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++的環(huán)境下編譯后就會發(fā)現(xiàn):

二、C語言強(qiáng)制類型轉(zhuǎn)換存在的問題
過于粗暴
- 任意類型之間都可以進(jìn)行轉(zhuǎn)換,編譯器很難判斷其正確性
難于定位
- 在源碼中無法快速定位所有使用強(qiáng)制類型轉(zhuǎn)換的語句
三、C++ 中的類型轉(zhuǎn)換
C++ 將強(qiáng)制類型轉(zhuǎn)換分為4種不同的類型:
C++強(qiáng)制類型轉(zhuǎn)換
| static_cast | const_cast |
| dynamic_cast | reinterpret_cast |
用法:xxx_cast<Type >( Expression )
static_cast 強(qiáng)制類型轉(zhuǎn)換
- 用于基本類型間的轉(zhuǎn)換
- 不能用于基本類型指針間的轉(zhuǎn)換
- 用于有繼承關(guān)系類對象之間的轉(zhuǎn)換和類指針之間的轉(zhuǎn)換
const_cast 強(qiáng)制類型轉(zhuǎn)換
- 用于去除變量的只讀屬性
- 強(qiáng)制轉(zhuǎn)換的目標(biāo)類型必須是指針或引用
reinterpret_cast 強(qiáng)制類型轉(zhuǎn)換
- 用于指針類型間的強(qiáng)制轉(zhuǎn)換
- 用于整數(shù)和指針類型間的強(qiáng)制轉(zhuǎn)換
dynamic_cast 強(qiáng)制類型轉(zhuǎn)換
- 用于有繼承關(guān)系的類指針間的轉(zhuǎn)換
- 用于有交叉關(guān)系的類指針間的轉(zhuǎn)換
- 具有類型檢查的功能
- 需要虛函數(shù)的支持
??????下面看一段C++類型轉(zhuǎn)換代碼:
#include <stdio.h>
void static_cast_demo()
{
int i = 0x12345;
char c = 'c';
int* pi = &i;
char* pc = &c;
c = static_cast<char>(i);
//pc = static_cast<char*>(pi);
}
void const_cast_demo()
{
const int& j = 1;
int& k = const_cast<int&>(j);
const int x = 2;
int& y = const_cast<int&>(x);
//int z = const_cast<int>(x);
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);
}
void dynamic_cast_demo()
{
int i = 0;
int* pi = &i;
//char* pc = dynamic_cast<char*>(pi);
}
int main()
{
static_cast_demo();
const_cast_demo();
reinterpret_cast_demo();
dynamic_cast_demo();
return 0;
}下面為輸出結(jié)果:

注意程序注釋的4個地方,都是錯誤使用了類型轉(zhuǎn)換:
第一個地方:pc = static_cast<char*>(pi) 。錯誤在于static_cast 不能在基本類型指針之間相互轉(zhuǎn)換。
第二個地方:int z = const_cast<int>(x)。錯誤在于const_cast強(qiáng)制轉(zhuǎn)換的目標(biāo)類型必須是指針或引用。
第三個地方:c = reinterpret_cast<char>(i)。錯誤在于 const_cast用于指針類型間的強(qiáng)制轉(zhuǎn)換,而不能用于基本類型。
第四個地方:char* pc = dynamic_cast<char*>(pi)。錯誤在于dynamic_cast需要虛函數(shù)的支持。
還有一個問題就是 x 和 y 值的問題。x 是一個真正意義上的常量,所以編譯期間值確定了就是2,但是編譯器要兼容 C語言,所以會給 x 在??臻g分配了4個字節(jié)的空間出來,使用 const_cast 作用于它就相當(dāng)于給這 4個字節(jié)空間取了一個別名 y,令 y = 8,就相當(dāng)于給這 4個字節(jié)??臻g中的 int 變量賦了一個值 8。所以打印出來的 x 和 y的地址值是一樣的。
四、小結(jié)
C 方式的強(qiáng)制類型轉(zhuǎn)換
- 過于粗暴
- 潛在的問題不易被發(fā)現(xiàn)
- 不易在代碼中定位
新式類型轉(zhuǎn)換以C++ 關(guān)鍵字的方式出現(xiàn)
- 編譯器能夠幫助檢查潛在的問題
- 非常方便的在代碼中定位
- 支持動態(tài)類型識別( dynamic_cast )
到此這篇關(guān)于C++簡明講解類型轉(zhuǎn)換的使用與作用的文章就介紹到這了,更多相關(guān)C++ 類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++連接mysql數(shù)據(jù)庫的兩種方法小結(jié)
這篇文章主要介紹了C++連接mysql數(shù)據(jù)庫的兩種方法小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
C++編程析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)使用示例詳解
這篇文章主要為大家介紹了C++編程構(gòu)造函數(shù)中析構(gòu)函數(shù)及拷貝構(gòu)造函數(shù)的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11

