亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++中4種強制類型轉換的區(qū)別詳析

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

前言

C++即支持C風格的類型轉換,又有自己風格的類型轉換。C風格的轉換格式很簡單,但是有不少缺點的:

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

  2.C風格的轉換沒有統(tǒng)一的關鍵字和標示符。對于大型系統(tǒng),做代碼排查時容易遺漏和忽略。

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

一、static_cast轉換

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

  2.使用場景:

  a、用于類層次結構中基類和派生類之間指針或引用的轉換

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

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

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

  c、把空指針轉換成目標類型的空指針

  d、把任何類型的表達式轉為void類型

  3.使用特點

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

  b、隱式轉換都建議使用static_cast進行標明和替換

二、dynamic_cast轉換

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

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

  3.使用特點:

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

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

  c、dynamic_cast還可以進行交叉轉換

三、const_cast轉換

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

  2.使用場景:

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

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

  3.使用特點:

  a、cosnt_cast是四種類型轉換符中唯一可以對常量進行操作的轉換符

  b、去除常量性是一個危險的動作,盡量避免使用。一個特定的場景是:類通過const提供重載時,一般都是非常量函數調用const_cast<const T>將參數轉換為常量,然后調用常量函數,然后得到結果再調用const_cast <T>去除常量性。

四、reinterpret_cast轉換

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

  2.使用場景:不到萬不得已,不用使用這個轉換符,高危操作

  3.使用特點:  

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

  b、reinterpret_cast可以將整型轉換為指針,也可以把指針轉換為數組

  c、reinterpret_cast可以在指針和引用里進行肆無忌憚的轉換

五、各種轉換之間的比較

  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.無編譯告警,但是危險操作,譬如說調用drvPtrA->_d會造成不可預知的后果*/
 Derived *drvPtrA = static_cast<Derived *>(&base);
 
 drvPtrA->_d = 4;
 drvPtrA->_e = 5;
 /*2.輸出:tempA為5,tempB為4,踩內存了(機器信息:32位ubuntu,編譯器clang++)*/
 cout<<tempA<<endl;
 cout<<tempB<<endl;
 
 /*3.Base中沒有虛函數,無法查看運行時信息,編譯不過*/
 Derived *drvPtrB = dynamic_cast<Derived *>(base);

 return 0;
}

  在基類派生類互相轉換時,雖然static_cast是在編譯期完成,效率更高,但是不安全,上例中就示范了一個踩內存的例子。相比之下因為dynamic_cast可以查看運行時信息,上例如果Base含有虛函數,那么drvPtrB就是一個空指針(這可比踩內存什么的好多了),不能操作Derived中_d的數據從而保證安全性,所以應該優(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.無任何編譯告警,編譯通過,正常運行*/
 BaseB *baseC = reinterpret_cast<BaseB *>(&baseA);
 cout<<baseC->_d<<endl;

 return 0;
}

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

總結

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

相關文章

  • C語言實現停車場項目

    C語言實現停車場項目

    這篇文章主要為大家詳細介紹了C語言實現停車場項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言實現矩陣翻轉(上下翻轉、左右翻轉)

    C語言實現矩陣翻轉(上下翻轉、左右翻轉)

    這篇文章主要介紹了C語言實現矩陣翻轉(上下翻轉、左右翻轉)的相關資料,需要的朋友可以參考下
    2017-05-05
  • 基于C語言代碼實現點餐系統(tǒng)

    基于C語言代碼實現點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了基于C語言代碼實現點餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C語言數據結構中串的模式匹配

    C語言數據結構中串的模式匹配

    這篇文章主要介紹了C語言數據結構中串的模式匹配的相關資料,需要的朋友可以參考下
    2017-05-05
  • 380行C++代碼實現掃雷小游戲

    380行C++代碼實現掃雷小游戲

    這篇文章主要為大家詳細介紹了380行C++代碼實現掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C++構造函數和析構函數的使用與講解

    C++構造函數和析構函數的使用與講解

    今天小編就為大家分享一篇關于C++構造函數和析構函數的使用與講解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++ 類模板、函數模板全特化、偏特化的使用

    C++ 類模板、函數模板全特化、偏特化的使用

    這篇文章主要介紹了C++ 類模板、函數模板全特化、偏特化的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • C語言各種操作符透徹理解上篇

    C語言各種操作符透徹理解上篇

    C 語言提供了豐富的操作符,有:算術操作符,移位操作符,位操作符,賦值操作符。讓我們通讀本篇來詳細了解吧
    2022-02-02
  • 解析C語言與C++的編譯模型

    解析C語言與C++的編譯模型

    C++繼承了C的編譯模型,C語言的編譯鏈接模型相對簡潔,但C++繼承了這些機制之后變得更加復雜難以理解,這里就來帶大家簡要解析C語言與C++的編譯模型
    2016-05-05
  • 深入解析C語言中的內存分配相關問題

    深入解析C語言中的內存分配相關問題

    這篇文章主要深入地介紹了C語言中的內存分配,C語言編程中的內存泄漏問題一直以來都是C編程中的一大棘手問題,本文從malloc和指針等方面對C內存進行了深層次講解,強烈推薦!需要的朋友可以參考下
    2015-08-08

最新評論