C++簡明講解類型轉(zhuǎn)換的使用與作用_第1頁
C++簡明講解類型轉(zhuǎn)換的使用與作用_第2頁
C++簡明講解類型轉(zhuǎn)換的使用與作用_第3頁
C++簡明講解類型轉(zhuǎn)換的使用與作用_第4頁
C++簡明講解類型轉(zhuǎn)換的使用與作用_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第C++簡明講解類型轉(zhuǎn)換的使用與作用目錄一、C語言中的強(qiáng)制類型轉(zhuǎn)換二、C語言強(qiáng)制類型轉(zhuǎn)換存在的問題三、C++中的類型轉(zhuǎn)換四、小結(jié)

一、C語言中的強(qiáng)制類型轉(zhuǎn)換

轉(zhuǎn)換的語法如下:

(Type)(Expression)

Type(Expression)

下面看一段C語言中粗暴的類型轉(zhuǎn)換的代碼:

#includestdio.h

typedefvoid(PF)(int);

structPoint

intx;

inty;

intmain()

intv=0x12345;

PF*pf=(PF*)v;

charc=char(v);

Point*p=(Point*)v;

pf(5);

printf("p-x=%d\n",p-

printf("p-y=%d\n",p-

return0;

}

在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_castconst_castdynamic_castreinterpret_cast

用法:xxx_castType(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)換代碼:

#includestdio.h

voidstatic_cast_demo()

inti=0x12345;

charc='c';

int*pi=

char*pc=

c=static_castchar

//pc=static_castchar*(pi);

voidconst_cast_demo()

constintj=1;

intk=const_castint

constintx=2;

inty=const_castint

//intz=const_castint

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",

printf("y=%p\n",

voidreinterpret_cast_demo()

inti=0;

charc='c';

int*pi=

char*pc=

pc=reinterpret_castchar*(pi);

pi=reinterpret_castint*(pc);

pi=reinterpret_castint*

//c=reinterpret_castchar

voiddynamic_cast_demo()

inti=0;

int*pi=

//char*pc=dynamic_castchar*(pi);

intmain()

static_cast_demo();

const_cast_demo();

reinterpret_cast_demo();

dynamic_cast_demo();

return0;

}

下面為輸出結(jié)果:

注意程序注釋的4個(gè)地方,都是錯(cuò)誤使用了類型轉(zhuǎn)換:

第一個(gè)地方:pc=static_castchar*(pi)。錯(cuò)誤在于static_cast不能在基本類型指針之間相互轉(zhuǎn)換。

第二個(gè)地方:intz=const_castint(x)。錯(cuò)誤在于const_cast強(qiáng)制轉(zhuǎn)換的目標(biāo)類型必須是指針或引用。

第三個(gè)地方:c=reinterpret_castchar(i)。錯(cuò)誤在于const_cast用于指針類型間的強(qiáng)制轉(zhuǎn)換,而不能用于基本類型。

第四個(gè)地方:char*pc=dynamic_castchar*(pi)。錯(cuò)誤在于dynamic_cast需要虛函數(shù)的支持。

還有一個(gè)問題就是x和y值的問題。x是一個(gè)真正意義上的常量,所以編譯期間值確定了就是2,但是編譯器要兼容C語言,所以會給x在棧空間分配了4個(gè)字節(jié)的空間出來,使用const_cast作用于它就相當(dāng)于給這4個(gè)字節(jié)空間取了一個(gè)別名y,令y=8,就相當(dāng)于給這4個(gè)字節(jié)棧空間中的int變量賦了一個(gè)值8。所以打印出來的x和y的地址值是一樣

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論