C++中的類型轉(zhuǎn)換


強制類型轉(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;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末橱野,一起剝皮案震驚了整個濱河市朽缴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌水援,老刑警劉巖密强,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異裹唆,居然都是意外死亡誓斥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進(jìn)店門许帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劳坑,“玉大人,你說我怎么就攤上這事成畦【喾遥” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵循帐,是天一觀的道長框仔。 經(jīng)常有香客問我,道長拄养,這世上最難降的妖魔是什么离斩? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任银舱,我火速辦了婚禮,結(jié)果婚禮上跛梗,老公的妹妹穿的比我還像新娘寻馏。我一直安慰自己,他們只是感情好核偿,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布诚欠。 她就那樣靜靜地躺著,像睡著了一般漾岳。 火紅的嫁衣襯著肌膚如雪轰绵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天尼荆,我揣著相機與錄音左腔,去河邊找鬼。 笑死捅儒,一個胖子當(dāng)著我的面吹牛翔悠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播野芒,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼蓄愁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了狞悲?” 一聲冷哼從身側(cè)響起撮抓,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摇锋,沒想到半個月后丹拯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡荸恕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年乖酬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片融求。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡咬像,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出生宛,到底是詐尸還是另有隱情县昂,我是刑警寧澤,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布陷舅,位于F島的核電站倒彰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏莱睁。R本人自食惡果不足惜待讳,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一芒澜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧创淡,春花似錦撰糠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旨袒。三九已至汁针,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砚尽,已是汗流浹背施无。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留必孤,地道東北人猾骡。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像敷搪,于是被迫代替她去往敵國和親兴想。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容

  • C語言里面赡勘,類型轉(zhuǎn)換方法如下: C++中則提供了更為豐富的類型轉(zhuǎn)換方式嫂便,總共有4種: static_cast<ty...
    Mordekaiser閱讀 277評論 0 0
  • C++中的類型轉(zhuǎn)換 顯示轉(zhuǎn)換 命名的強制類型轉(zhuǎn)換 static_cast dynamic_cast const_c...
    一個咸芋閱讀 549評論 0 0
  • 基礎(chǔ)類型轉(zhuǎn)換 標(biāo)準(zhǔn)數(shù)據(jù)類型之間會進(jìn)行隱式的類型安全轉(zhuǎn)換 轉(zhuǎn)換規(guī)則如下:(char -> short)-> int ...
    nethanhan閱讀 1,196評論 0 0
  • 文章轉(zhuǎn)載自c的四種類型轉(zhuǎn)換 使用標(biāo)準(zhǔn)C++的類型轉(zhuǎn)換符:static_cast、dynamic_cast闸与、rein...
    Yihulee閱讀 1,393評論 0 1
  • 本文根據(jù)眾多互聯(lián)網(wǎng)博客內(nèi)容整理后形成毙替,引用內(nèi)容的版權(quán)歸原始作者所有,僅限于學(xué)習(xí)研究使用践樱,不得用于任何商業(yè)用途厂画。 首...
    深紅的眼眸閱讀 1,635評論 0 1