中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中強制類型轉換方法有哪些

發布時間:2020-10-13 16:08:53 來源:億速云 閱讀:191 作者:小新 欄目:編程語言

小編給大家分享一下C++中強制類型轉換方法有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

C中的類型轉換:

  事情要從頭說起,這個頭就是C語言.我們已經習慣了使用C-like類型轉換,因為它強大而且簡單.

主要有一下兩種形式:

  • (new-type) expression

  • new-type (expression)

C風格的轉換格式很簡單,但是有不少缺點:

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

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

C++中的類型轉換:

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

  • static_cast,命名上理解是靜態類型轉換。如int轉換成char。

  • dynamic_cast,命名上理解是動態類型轉換。如子類和父類之間的多態類型轉換。

  • const_cast,字面上理解就是去const屬性。

  • reinterpreter_cast,僅僅重新解釋類型,但沒有進行二進制的轉換。

一、static_cast轉換

  1.基本用法:static_cast expression

  2.使用場景

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

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

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

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

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

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

  3.使用特點

  a、主要執行非多態的轉換操作,用于代替C中通常的轉換操作

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

int n = 6;double d = static_cast<double>(n); // 基本類型轉換int *pn = &n;double *d = static_cast<double *>(&n) //無關類型指針轉換,編譯錯誤void *p = static_cast<void *>(pn); //任意類型轉換成void類型

二、dynamic_cast轉換

  1.基本用法:dynamic_cast expression

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

  3.使用特點

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

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

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

class BaseClass 
{public:
  int m_iNum;
  virtual void foo(){};//基類必須有虛函數。保持多臺特性才能使用dynamic_cast};class DerivedClass: public BaseClass 
{public:
  char *m_szName[100];
  void bar(){};
};
  
BaseClass* pb = new DerivedClass();
DerivedClass *pd1 = static_cast<DerivedClass *>(pb);//子類->父類,靜態類型轉換,正確但不推薦DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb);//子類->父類,動態類型轉換,正確BaseClass* pb2 = new BaseClass();//父類->子類,靜態類型轉換,危險!訪問子類m_szName成員越界DerivedClass *pd21 = static_cast<DerivedClass *>(pb2);//父類->子類,動態類型轉換,安全的。結果是NULLDerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2);

三、const_cast轉換

  1.基本用法:const_castexpression

  2.使用場景

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

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

  3.使用特點

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

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

struct SA 
{
  int i;
};const SA ra;//ra.i = 10; //直接修改const類型,編譯錯誤SA &rb = const_cast<SA&>(ra);
rb.i = 10;

四、reinterpret_cast轉換

  1.基本用法:reinterpret_castexpression

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

  3.使用特點:  

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

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

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

int doSomething(){return 0;};//FuncPtr is 一個指向函數的指針,該函數沒有參數,返回值類型為 voidtypedef void(*FuncPtr)();//10個FuncPtrs指針的數組 讓我們假設你希望(因為某些莫名其妙的原因)把一個指向下面函數的指針存//入funcPtrArray數組:FuncPtr funcPtrArray[10];

funcPtrArray[0] = &doSomething;// 編譯錯誤!類型不匹配,reinterpret_cast可以讓編譯器以你的方法去看待它們:funcPtrArrayfuncPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);//不同函數指針類型之間進行轉換

以上是C++中強制類型轉換方法有哪些的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

获嘉县| 孝义市| 长顺县| 孙吴县| 常熟市| 句容市| 长宁县| 祁东县| 海晏县| 牡丹江市| 凤庆县| 万山特区| 丰原市| 全椒县| 阳高县| 栖霞市| 通海县| 和田县| 琼中| 金川县| 闽侯县| 陇川县| 舟山市| 章丘市| 天柱县| 龙川县| 儋州市| 郓城县| 桦南县| 和硕县| 织金县| 合山市| 溧水县| 崇明县| 旬阳县| 胶南市| 廉江市| 沙坪坝区| 师宗县| 栾川县| 辽源市|