青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

芳草春暉

偶爾記錄自己思緒的地方...

 

詳解C++的static_cast、dynamic_cast、reinterpret_cast、和const_cast

關于強制類型轉換的問題,很多書都討論過,寫的最詳細的是C++ 之父的《C++ 的設計和演化》。最好的解決方法就是不要使用C風格的強制類型轉換,而是使用標準C++的類型轉換符:static_cast, dynamic_cast。標準C++中有四個類型轉換符:static_castdynamic_castreinterpret_cast、和const_cast。下面對它們一一進行介紹。

static_cast

用法:static_cast < type-id > ( expression )

該運算符把expression轉換為type-id類型,但沒有運行時類型檢查來保證轉換的安全性。它主要有如下幾種用法:
  • 用于類層次結構中基類和子類之間指針或引用的轉換。進行上行轉換(把子類的指針或引用轉換成基類表示)是安全的;進行下行轉換(把基類指針或引用轉換成子類表示)時,由于沒有動態類型檢查,所以是不安全的。
  • 用于基本數據類型之間的轉換,如把int轉換成char,把int轉換成enum。這種轉換的安全性也要開發人員來保證。
  • 把空指針轉換成目標類型的空指針。
  • 把任何類型的表達式轉換成void類型。
注意:static_cast不能轉換掉expression的const、volitale、或者__unaligned屬性。

dynamic_cast

用法:dynamic_cast < type-id > ( expression )

該運算符把expression轉換成type-id類型的對象。Type-id必須是類的指針、類的引用或者void *;如果type-id是類指針類型,那么expression也必須是一個指針,如果type-id是一個引用,那么expression也必須是一個引用。

dynamic_cast主要用于類層次間的上行轉換和下行轉換,還可以用于類之間的交叉轉換。

在類層次間進行上行轉換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全。
 class B{

public:

 int m_iNum;

 virtual void foo();

};

class D:public B{

 public:

 char *m_szName[100];

};

 

void func(B *pb){

 D *pd1 = static_cast<D *>(pb);

 D *pd2 = dynamic_cast<D *>(pb);

}

在上面的代碼段中,如果pb指向一個D類型的對象,pd1和pd2是一樣的,并且對這兩個指針執行D類型的任何操作都是安全的;但是,如果pb指向的是一個B類型的對象,那么pd1將是一個指向該對象的指針,對它進行D類型的操作將是不安全的(如訪問m_szName),而pd2將是一個空指針。另外要注意:B要有虛函數,否則會編譯出錯;static_cast則沒有這個限制。這是由于運行時類型檢查需要運行時類型信息,而這個信息存儲在類的虛函數表(關于虛函數表的概念,詳細可見<Inside c++ object model>)中,只有定義了虛函數的類才有虛函數表,沒有定義虛函數的類是沒有虛函數表的。

另外,dynamic_cast還支持交叉轉換(cross cast)。如下代碼所示。
class A{

public:

 int m_iNum;

 virtual void f(){}

};

 

class B:public A{

};

 

class D:public A{

};

 

void foo(){

 B *pb = new B;

 pb->m_iNum = 100;

 D *pd1 = static_cast<D *>(pb); //copile error

 D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL

 delete pb;

}

在函數foo中,使用static_cast進行轉換是不被允許的,將在編譯時出錯;而使用 dynamic_cast的轉換則是允許的,結果是空指針。

reinpreter_cast

用法:reinpreter_cast<type-id> (expression)

type-id必須是一個指針、引用、算術類型、函數指針或者成員指針。它可以把一個指針轉換成一個整數,也可以把一個整數轉換成一個指針(先把一個指針轉換成一個整數,在把該整數轉換成原類型的指針,還可以得到原先的指針值)。

該運算符的用法比較多。

const_cast

用法:const_cast<type_id> (expression)

該運算符用來修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類型是一樣的。

常量指針被轉化成非常量指針,并且仍然指向原來的對象;常量引用被轉換成非常量引用,并且仍然指向原來的對象;常量對象被轉換成非常量對象。

Voiatile和const類試。舉如下一例:
class B{

 public:

 int m_iNum;

}

void foo(){

const B b1;

b1.m_iNum = 100; //comile error

B b2 = const_cast<B>(b1);

b2. m_iNum = 200; //fine
 }

上面的代碼編譯時會報錯,因為b1是一個常量對象,不能對它進行改變;使用const_cast把它轉換成一個常量對象,就可以對它的數據成員任意改變。注意:b1和b2是兩個不同的對象。

posted on 2010-05-18 17:20 CrazyDev 閱讀(526) 評論(0)  編輯 收藏 引用 所屬分類: 通用技術

導航

統計

常用鏈接

留言簿(1)

隨筆檔案

文章分類

文章檔案

C/C++

CEGUI

Friend Bog

Game Industry

Lua

OGRE

Other

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久人成影片一区二区三区| 亚洲香蕉网站| 亚洲国产天堂久久综合网| 久久激情视频| 久久久免费精品| 亚洲一卡久久| 亚洲一区在线免费| 在线观看视频一区| 99riav国产精品| 国产一区二区精品丝袜| 欧美激情网友自拍| 欧美天天在线| 欧美成人在线网站| 国产欧美一二三区| 亚洲国产综合在线| 欧美午夜精品理论片a级大开眼界| 午夜日韩在线| 先锋影音国产精品| 欧美a级一区二区| 新狼窝色av性久久久久久| 欧美成人a视频| 久久综合伊人77777| 欧美性一区二区| 亚洲日韩视频| 免费成人你懂的| 国产精品爽爽ⅴa在线观看| 免费欧美视频| 亚洲第一偷拍| 久久久精品性| 久久中文欧美| 在线播放日韩欧美| 久久久精品动漫| 免费日韩av电影| 国产综合色产| 久久久成人网| 久久最新视频| 亚洲福利视频专区| 欧美大片免费久久精品三p| 欧美二区在线观看| 狠狠色伊人亚洲综合成人| 久久精品夜色噜噜亚洲aⅴ| 久久久综合精品| 亚洲国产日韩欧美在线动漫| 久久精品国产精品亚洲综合| 久久亚洲不卡| 亚洲美女av电影| 国产精品扒开腿做爽爽爽软件 | 久久综合久久美利坚合众国| 国产日韩欧美视频在线| 欧美一二三区在线观看| 欧美成年人网| 亚洲欧美一区二区精品久久久| 国产精品视频一二| 久久久国产精品亚洲一区| 亚洲精品你懂的| 亚洲永久在线观看| 欧美成人综合| 欧美永久精品| 亚洲欧美日本国产有色| 尹人成人综合网| 国产伦一区二区三区色一情| 久久久精品一区二区三区| 亚洲美女区一区| 久久久久久久久一区二区| 亚洲免费在线观看视频| 亚洲激情专区| 狠狠爱成人网| 国产视频久久| 国产网站欧美日韩免费精品在线观看 | 亚洲一区免费看| 一区二区三区视频免费在线观看| 美女精品在线观看| 久久精品欧美日韩| 久久久天天操| 蜜桃av一区二区三区| 免费av成人在线| 免费观看成人| 亚洲国产一区在线| 日韩亚洲国产精品| 亚洲午夜精品一区二区| 亚洲男女自偷自拍图片另类| 99re国产精品| 一区二区三区精密机械公司 | 在线观看日韩av电影| 国产一区二区三区免费不卡| 国产精品午夜久久| 激情丁香综合| 亚洲美女av黄| 欧美一区二区高清| 另类天堂视频在线观看| 奶水喷射视频一区| 亚洲乱码国产乱码精品精可以看 | 国产日本欧美一区二区| 精品51国产黑色丝袜高跟鞋| 亚洲福利av| 午夜精品久久久久久久99水蜜桃| 久久久久久久久久久久久女国产乱 | 午夜在线一区| 久久大综合网| 欧美国产免费| 亚洲午夜久久久| 欧美风情在线| 欧美日本免费一区二区三区| 欧美日本在线观看| 欧美日韩国产高清| 91久久精品国产91性色tv| 一本色道久久综合狠狠躁篇怎么玩 | 亚洲欧美一区二区三区在线| 国产日韩在线一区二区三区| 久久久久久一区二区三区| 欧美激情 亚洲a∨综合| 亚洲免费av观看| 欧美日韩亚洲高清一区二区| 亚洲无线一线二线三线区别av| 久久久视频精品| 制服丝袜亚洲播放| 免费不卡在线观看av| 国产精品三上| 亚洲毛片av| 久久不见久久见免费视频1| 亚洲第一精品电影| 一区二区高清视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久综合九色| 日韩视频一区二区三区在线播放免费观看| 久久香蕉国产线看观看av| 99av国产精品欲麻豆| 久久一二三四| 最近看过的日韩成人| 西瓜成人精品人成网站| 亚洲午夜电影网| 国产伦精品一区二区三区| 噜噜噜躁狠狠躁狠狠精品视频| 免费观看成人网| 久久五月激情| 欧美日韩国产欧| 亚洲电影在线| 一区二区高清在线| 久久蜜桃香蕉精品一区二区三区| 99成人在线| 亚洲免费在线看| 欧美怡红院视频一区二区三区| 欧美国产精品v| 免费观看亚洲视频大全| 在线成人激情黄色| 久久最新视频| 久久久久五月天| 伊人久久婷婷| 欧美国产亚洲视频| 999在线观看精品免费不卡网站| 日韩天堂av| 国产免费成人av| 亚洲人成精品久久久久| 一区二区高清在线| 国产午夜精品福利| 乱中年女人伦av一区二区| 亚洲国产成人av好男人在线观看| 亚洲欧洲日产国产网站| 欧美日韩高清在线| 亚洲视频一区| 欧美激情精品久久久久久| 亚洲免费精彩视频| 国产精品自拍三区| 欧美精品亚洲精品| 香港久久久电影| 亚洲精品日韩久久| 老司机午夜精品视频在线观看| 亚洲三级视频| 国产亚洲欧美一区二区| 欧美精品三级| 久久精品国产一区二区三区| 91久久精品国产91久久性色tv| 亚洲欧美日韩一区二区| 91久久国产综合久久| 国产亚洲一级| 国产精品美女久久福利网站| 久久亚洲捆绑美女| 欧美一区二区三区免费看| 日韩视频免费大全中文字幕| 美女性感视频久久久| 欧美亚洲专区| 午夜国产一区| 欧美一区二区三区啪啪| 亚洲视频网站在线观看| 亚洲精品孕妇| 在线午夜精品| 国产精品99久久久久久久久| 亚洲精品123区| 亚洲国产日韩一区二区| 亚洲国产高清一区二区三区| 精品51国产黑色丝袜高跟鞋| 国产亚洲欧美另类中文| 国语自产精品视频在线看抢先版结局 | 国产综合久久| 国产乱码精品一区二区三区忘忧草| 欧美日韩国产精品一区| 欧美日韩国产欧美日美国产精品| 欧美v日韩v国产v| 欧美激情第3页| 欧美国产日韩xxxxx|