欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中4種強(qiáng)制類型轉(zhuǎn)換的區(qū)別詳析

 更新時(shí)間:2021年03月05日 14:18:45   作者:制造天堂  
這篇文章主要給大家介紹了關(guān)于C++中4種強(qiáng)制類型轉(zhuǎn)換區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

C++即支持C風(fēng)格的類型轉(zhuǎn)換,又有自己風(fēng)格的類型轉(zhuǎn)換。C風(fēng)格的轉(zhuǎn)換格式很簡單,但是有不少缺點(diǎn)的:

  1.轉(zhuǎn)換太過隨意,可以在任意類型之間轉(zhuǎn)換。你可以把一個(gè)指向const對象的指針轉(zhuǎn)換成指向非const對象的指針,把一個(gè)指向基類對象的指針轉(zhuǎn)換成一個(gè)派生類對象的指針,這些轉(zhuǎn)換之間的差距是非常巨大的,但是傳統(tǒng)的C語言風(fēng)格的類型轉(zhuǎn)換沒有區(qū)分這些。

  2.C風(fēng)格的轉(zhuǎn)換沒有統(tǒng)一的關(guān)鍵字和標(biāo)示符。對于大型系統(tǒng),做代碼排查時(shí)容易遺漏和忽略。

  C++風(fēng)格完美的解決了上面兩個(gè)問題。1.對類型轉(zhuǎn)換做了細(xì)分,提供了四種不同類型轉(zhuǎn)換,以支持不同需求的轉(zhuǎn)換;2.類型轉(zhuǎn)換有了統(tǒng)一的標(biāo)示符,利于代碼排查和檢視。下面分別來介紹這四種轉(zhuǎn)換:static_cast、dynamic_cast、const_cast和reinterpre_cast.

一、static_cast轉(zhuǎn)換

  1.基本用法:static_cast<type-id> expression

  2.使用場景:

  a、用于類層次結(jié)構(gòu)中基類和派生類之間指針或引用的轉(zhuǎn)換

  上行轉(zhuǎn)換(派生類---->基類)是安全的;

  下行轉(zhuǎn)換(基類---->派生類)由于沒有動態(tài)類型檢查,所以是不安全的。

  b、用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換為char,這種帶來安全性問題由程序員來保證

  c、把空指針轉(zhuǎn)換成目標(biāo)類型的空指針

  d、把任何類型的表達(dá)式轉(zhuǎn)為void類型

  3.使用特點(diǎn)

  a、主要執(zhí)行非多態(tài)的轉(zhuǎn)換操作,用于代替C中通常的轉(zhuǎn)換操作

  b、隱式轉(zhuǎn)換都建議使用static_cast進(jìn)行標(biāo)明和替換

二、dynamic_cast轉(zhuǎn)換

  1.基本用法:dynamic_cast<type-id> expression

  2.使用場景:只有在派生類之間轉(zhuǎn)換時(shí)才使用dynamic_cast,type-id必須是類指針,類引用或者void*。

  3.使用特點(diǎn):

  a、基類必須要有虛函數(shù),因?yàn)閐ynamic_cast是運(yùn)行時(shí)類型檢查,需要運(yùn)行時(shí)類型信息,而這個(gè)信息是存儲在類的虛函數(shù)表中,只有一個(gè)類定義了虛函數(shù),才會有虛函數(shù)表(如果一個(gè)類沒有虛函數(shù),那么一般意義上,這個(gè)類的設(shè)計(jì)者也不想它成為一個(gè)基類)。

  b、對于下行轉(zhuǎn)換,dynamic_cast是安全的(當(dāng)類型不一致時(shí),轉(zhuǎn)換過來的是空指針),而static_cast是不安全的(當(dāng)類型不一致時(shí),轉(zhuǎn)換過來的是錯(cuò)誤意義的指針,可能造成踩內(nèi)存,非法訪問等各種問題)

  c、dynamic_cast還可以進(jìn)行交叉轉(zhuǎn)換

三、const_cast轉(zhuǎn)換

  1.基本用法:const_cast<type-id>expression

  2.使用場景:

  a、常量指針轉(zhuǎn)換為非常量指針,并且仍然指向原來的對象

  b、常量引用被轉(zhuǎn)換為非常量引用,并且仍然指向原來的對象

  3.使用特點(diǎn):

  a、cosnt_cast是四種類型轉(zhuǎn)換符中唯一可以對常量進(jìn)行操作的轉(zhuǎn)換符

  b、去除常量性是一個(gè)危險(xiǎn)的動作,盡量避免使用。一個(gè)特定的場景是:類通過const提供重載時(shí),一般都是非常量函數(shù)調(diào)用const_cast<const T>將參數(shù)轉(zhuǎn)換為常量,然后調(diào)用常量函數(shù),然后得到結(jié)果再調(diào)用const_cast <T>去除常量性。

四、reinterpret_cast轉(zhuǎn)換

  1.基本用法:reinterpret_cast<type-id>expression

  2.使用場景:不到萬不得已,不用使用這個(gè)轉(zhuǎn)換符,高危操作

  3.使用特點(diǎn):  

  a、reinterpret_cast是從底層對數(shù)據(jù)進(jìn)行重新解釋,依賴具體的平臺,可移植性差

  b、reinterpret_cast可以將整型轉(zhuǎn)換為指針,也可以把指針轉(zhuǎn)換為數(shù)組

  c、reinterpret_cast可以在指針和引用里進(jìn)行肆無忌憚的轉(zhuǎn)換

五、各種轉(zhuǎn)換之間的比較

  1.static_cast和dynamic_cast

class Base
{
 public:
 Base(int c = 2):_c(c){}
 public:
 int _c;
};
class Derived:public Base
{
 public:
 int _d;
 int _e;
};
int main(void)
{
 int tempA = 2;
 int tempB = 3;
 Base base;
 
 /*1.無編譯告警,但是危險(xiǎn)操作,譬如說調(diào)用drvPtrA->_d會造成不可預(yù)知的后果*/
 Derived *drvPtrA = static_cast<Derived *>(&base);
 
 drvPtrA->_d = 4;
 drvPtrA->_e = 5;
 /*2.輸出:tempA為5,tempB為4,踩內(nèi)存了(機(jī)器信息:32位ubuntu,編譯器clang++)*/
 cout<<tempA<<endl;
 cout<<tempB<<endl;
 
 /*3.Base中沒有虛函數(shù),無法查看運(yùn)行時(shí)信息,編譯不過*/
 Derived *drvPtrB = dynamic_cast<Derived *>(base);

 return 0;
}

  在基類派生類互相轉(zhuǎn)換時(shí),雖然static_cast是在編譯期完成,效率更高,但是不安全,上例中就示范了一個(gè)踩內(nèi)存的例子。相比之下因?yàn)閐ynamic_cast可以查看運(yùn)行時(shí)信息,上例如果Base含有虛函數(shù),那么drvPtrB就是一個(gè)空指針(這可比踩內(nèi)存什么的好多了),不能操作Derived中_d的數(shù)據(jù)從而保證安全性,所以應(yīng)該優(yōu)先使用dynamic_cast。

  2.static_cast和reinterpret_cast

class BaseA
{
 public:
 BaseA(int c = 2):_c(c){}
 int _c;
};
class BaseB
{
 public:
 BaseB(int d = 3):_d(d){}
 int _d;
};
int main(void)
{
 BaseA baseA;
 /*1.編譯不過*/
 BaseB *baseB = static_cast<BaseB *>(&baseA);
 /*2.無任何編譯告警,編譯通過,正常運(yùn)行*/
 BaseB *baseC = reinterpret_cast<BaseB *>(&baseA);
 cout<<baseC->_d<<endl;

 return 0;
}

  static_cast雖然也不是一種絕對安全的轉(zhuǎn)換,但是它在轉(zhuǎn)換時(shí),還是會進(jìn)行必要的檢測(諸如指針越界計(jì)算,類型檢查)。reinterpret_cast完全是肆無忌憚,直接從二進(jìn)制開始重新映射解釋,是極度不安全的,再次提醒,不到萬不得已,不要使用。

總結(jié)

到此這篇關(guān)于C++中4種強(qiáng)制類型轉(zhuǎn)換區(qū)別的文章就介紹到這了,更多相關(guān)C++強(qiáng)制類型轉(zhuǎn)換區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 逗號運(yùn)算符的具體使用

    C++ 逗號運(yùn)算符的具體使用

    本文主要介紹了C++ 逗號運(yùn)算符的具體使用,使用逗號運(yùn)算符是為了把幾個(gè)表達(dá)式放在一起,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 深入解析C++和JAVA的字符串

    深入解析C++和JAVA的字符串

    這篇文章主要介紹了C++和JAVA的字符串,JAVA 中String 和StringBuffer的區(qū)別,需要的朋友可以參考下
    2015-07-07
  • C++ ffmpeg硬件解碼的實(shí)現(xiàn)方法

    C++ ffmpeg硬件解碼的實(shí)現(xiàn)方法

    這篇文章主要介紹了C++ ffmpeg硬件解碼的實(shí)現(xiàn),對FFmpeg多媒體解決方案中的視頻編解碼流程進(jìn)行研究。為嵌入式多媒體開發(fā)提供參考,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • C++11如何引入的尾置返回類型

    C++11如何引入的尾置返回類型

    C++11 標(biāo)準(zhǔn)引入的尾置返回類型,可以讓返回復(fù)雜類型的函數(shù)聲明更加清晰易讀,在無法使用C++14 標(biāo)準(zhǔn)的情況下,通過尾置返回類型的語法來推導(dǎo)函數(shù)模板的返回類型無疑是最簡便的方法,這篇文章主要介紹了C++11引入的尾置返回類型,需要的朋友可以參考下
    2023-01-01
  • 求32位機(jī)器上unsigned int的最大值及int的最大值的解決方法

    求32位機(jī)器上unsigned int的最大值及int的最大值的解決方法

    本篇文章是對求32位機(jī)器上unsigned int的最大值及int的最大值的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖問題

    C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖問題

    這篇文章主要介紹了C++11中條件標(biāo)量和互斥鎖應(yīng)用出現(xiàn)死鎖思考,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • C++學(xué)習(xí)之Lambda表達(dá)式的用法詳解

    C++學(xué)習(xí)之Lambda表達(dá)式的用法詳解

    Lambda?表達(dá)式(lambda?expression)是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名。本文就來為大家詳細(xì)講講C++中Lambda表達(dá)式的使用,需要的可以參考一下
    2022-07-07
  • C++中重載、重寫(覆蓋)和隱藏的區(qū)別實(shí)例分析

    C++中重載、重寫(覆蓋)和隱藏的區(qū)別實(shí)例分析

    這篇文章主要介紹了C++中重載、重寫(覆蓋)和隱藏的區(qū)別,是C++面向?qū)ο蟪绦蛟O(shè)計(jì)非常重要的概念,需要的朋友可以參考下
    2014-08-08
  • C++11 call_once 和 once_flag的使用與區(qū)別

    C++11 call_once 和 once_flag的使用與區(qū)別

    本文主要介紹了C++11 call_once 和 once_flag的使用與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 一波C語言二元查找樹算法題目解答實(shí)例匯總

    一波C語言二元查找樹算法題目解答實(shí)例匯總

    這篇文章主要介紹了一波C語言二元查找樹算法題目解答實(shí)例匯總,包括按層次遍歷和轉(zhuǎn)換為鏡像等基本算法題目,需要的朋友可以參考下
    2016-03-03

最新評論