日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ reinterpret_cast,const_cast等 显式类型转换总结

發布時間:2025/3/12 c/c++ 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ reinterpret_cast,const_cast等 显式类型转换总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C++代碼 ?
  • #include<iostream.h>?????
  • ????
  • int?main(void)?????
  • {?????
  • //reinterpret_cast?????
  • //將一個類型指針轉換為另一個類型指針,這種在轉換不修改指針變量值數據存放格式?????
  • //只需在編譯時重新解釋指針的類型,他可以將指針轉化為一個整型數但不能用于非指針的轉換?????
  • double?d=9.3;?????
  • double*?pd?=?&d;?????
  • int*?pi?=?reinterpret_cast<int?*>?(pd);?????
  • class?A{};?????
  • class?B{};?????
  • A*?pa?=?new?A;?????
  • B*?pb=reinterpret_cast<B*>(pa);?//將pa?轉為B?????
  • long?j=reinterpret_cast<long>?(pa);//指針轉換為整數?????
  • //?int?i=9;?????
  • //?double?x=reinterpret_cast<double>(i);?//reinterpret_cast不能用于非指針的轉換?????
  • ????
  • //const_cast?????
  • //1.用于去除指針變量的常屬性,將它轉換為一個對應指針類型的普通變量,?????
  • //2.反過來也可以將一個非常量指針轉換為一個常量指針變量?????
  • //3.他無法將一個非指針的常量轉換為普通變量?????
  • //example:?const?i=10;?????
  • //?????????int?j=const_cast<int>(i);?//無法轉換?????
  • const?int?ppp=998;?????
  • ????
  • ????const?int*?pca=&ppp;?????
  • int*?p=const_cast<int*>(pca);//將它轉換為一個對應指針類型的普通變量,去除了const;?????
  • ????
  • const?A*?paa=new?A;?????
  • A?*?ppppa=const_cast<A*>?(paa);//它轉換為一個對應指針類型的普通變量,去除了const;?????
  • ????
  • int?*?pii=0;//反過來也可以將一個非常量指針轉換為一個常量指針變量?????
  • const?int*?piiic=const_cast<const?int?*>(pii);?????
  • //?????
  • ????
  • //static_cast?????
  • //用于轉換基本類型和具有繼承關系的類新之間轉換?????
  • //static_cast不太用于指針類型的之間的轉換,他的效率沒有reinterpret_cast的效率高?????
  • ????
  • int?in=99;?????
  • double?dn=static_cast<double>?(in);//用于轉換基本類型和具有繼承關系的類新之間轉換?????
  • ????
  • class?Base{};?????
  • class?derv:public?Base{};?????
  • derv?dd;?????
  • Base?bbbb=static_cast<Base>(dd);//具有繼承關系的類型之間轉換?????
  • ?????????
  • //static_cast不太用于指針類型的之間的轉換,他的效率沒有reinterpret_cast的效率高?????
  • Base?*pb1=new?Base;?????
  • derv?*pder=static_cast<derv*>(pb1);//基類轉繼承類?????
  • derv*?pder1=new?derv;?????
  • Base*?pbase1=static_cast<Base*>(pder1);//繼承類指針轉父類指針?????
  • //?????
  • ????
  • //dynamic_cast?????
  • //1.只能在繼承類對象的指針之間或引用之間進行類型轉換?????
  • //2.這種轉換并非在編譯時,而是在運行時,動態的?????
  • //3.沒有繼承關系,但被轉換的類具有虛函數對象的指針進行轉換?????
  • derv*?dp=new?derv;?????
  • Base*?bv=dynamic_cast<Base?*>(dp);//繼承類對象的指針之間進行類型轉換?????
  • ????
  • derv?dpp;//繼承類對象引用之間進行類型轉換?????
  • Base?&b=dynamic_cast<Base&>(dpp);?????
  • ????
  • class?AA{virtual?fun(){}?????
  • virtual?~AA(){}};?????
  • class?BB{};?????
  • ????
  • //沒有繼承關系,但被轉換的類具有虛函數對象的指針進行轉換,編譯可通過?????
  • AA*?pAA=new?AA;?????
  • BB*?pBB=dynamic_cast<BB?*>(pAA);?????
  • ????
  • //沒有繼承關系,被轉換的類也沒有有虛函數對象的指針進行轉換,編譯不能通過?????
  • BB*?pBBB=new?BB;?????
  • AA*?pAAA=dynamic_cast<AA*>(pBBB);?????
  • ????
  • ????
  • ????
  • return?1;?????
  • }????
  • #include<iostream.h> int main(void) { //reinterpret_cast //將一個類型指針轉換為另一個類型指針,這種在轉換不修改指針變量值數據存放格式 //只需在編譯時重新解釋指針的類型,他可以將指針轉化為一個整型數但不能用于非指針的轉換 double d=9.3; double* pd = &d; int* pi = reinterpret_cast<int *> (pd); class A{}; class B{}; A* pa = new A; B* pb=reinterpret_cast<B*>(pa); //將pa 轉為B long j=reinterpret_cast<long> (pa);//指針轉換為整數 // int i=9; // double x=reinterpret_cast<double>(i); //reinterpret_cast不能用于非指針的轉換 //const_cast //1.用于去除指針變量的常屬性,將它轉換為一個對應指針類型的普通變量, //2.反過來也可以將一個非常量指針轉換為一個常量指針變量 //3.他無法將一個非指針的常量轉換為普通變量 //example: const i=10; // int j=const_cast<int>(i); //無法轉換 const int ppp=998; const int* pca=&ppp; int* p=const_cast<int*>(pca);//將它轉換為一個對應指針類型的普通變量,去除了const; const A* paa=new A; A * ppppa=const_cast<A*> (paa);//它轉換為一個對應指針類型的普通變量,去除了const; int * pii=0;//反過來也可以將一個非常量指針轉換為一個常量指針變量 const int* piiic=const_cast<const int *>(pii); // //static_cast //用于轉換基本類型和具有繼承關系的類新之間轉換 //static_cast不太用于指針類型的之間的轉換,他的效率沒有reinterpret_cast的效率高 int in=99; double dn=static_cast<double> (in);//用于轉換基本類型和具有繼承關系的類新之間轉換 class Base{}; class derv:public Base{}; derv dd; Base bbbb=static_cast<Base>(dd);//具有繼承關系的類型之間轉換 //static_cast不太用于指針類型的之間的轉換,他的效率沒有reinterpret_cast的效率高 Base *pb1=new Base; derv *pder=static_cast<derv*>(pb1);//基類轉繼承類 derv* pder1=new derv; Base* pbase1=static_cast<Base*>(pder1);//繼承類指針轉父類指針 // //dynamic_cast //1.只能在繼承類對象的指針之間或引用之間進行類型轉換 //2.這種轉換并非在編譯時,而是在運行時,動態的 //3.沒有繼承關系,但被轉換的類具有虛函數對象的指針進行轉換 derv* dp=new derv; Base* bv=dynamic_cast<Base *>(dp);//繼承類對象的指針之間進行類型轉換 derv dpp;//繼承類對象引用之間進行類型轉換 Base &b=dynamic_cast<Base&>(dpp); class AA{virtual fun(){} virtual ~AA(){}}; class BB{}; //沒有繼承關系,但被轉換的類具有虛函數對象的指針進行轉換,編譯可通過 AA* pAA=new AA; BB* pBB=dynamic_cast<BB *>(pAA); //沒有繼承關系,被轉換的類也沒有有虛函數對象的指針進行轉換,編譯不能通過 BB* pBBB=new BB; AA* pAAA=dynamic_cast<AA*>(pBBB); return 1; }
    總結:

    reinterpret_cast 將一個類型指針轉換為另一個類型指針
    const_cast??? 用于去除指針變量的常屬性,將它轉換為一個對應指針類型的普通變量,反過來也可以將一個非常量指針轉換為一個常量指針變量
    static_cast??? 用于轉換基本類型和具有繼承關系的類新之間轉換,不太用于指針類型的之間的轉換
    dynamic_cast??? 只能在繼承類對象的指針之間或引用之間進行類型轉換

    以上只有dynamic_cast這種轉換并非在編譯時,而是在運行時,動態的。其它均在編譯時

    ——————————————————————————————————————

    標準C++的類型轉換符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。

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

    注意:static_cast不能轉換掉exdivssion的const、volitale、或者__unaligned屬性。


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

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

    dynamic_cast和static_cast的效果是一樣的;
    在進行下行轉換時,dynamic_cast具有類型檢查的功能,比static_cast更安全。
    C++代碼 ?
  • 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);?????
  • }????
  • 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則沒有這個限制。
    這是由于運行時類型檢查需要運行時類型信息,而這個信息存儲在類的虛函數表(
    關于虛函數表的概念,詳細可見)中,只有定義了虛函數的類才有虛函數表,
    沒有定義虛函數的類是沒有虛函數表的。

    另外,dynamic_cast還支持交叉轉換(cross cast)。如下代碼所示。
    C++代碼 ?
  • 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);?//compile?error?????
  • D?*pd2?=?dynamic_cast<D?*>((pb);?//pd2?is?NULL?????
  • delete?pb;?????
  • }????
  • 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); //compile error D *pd2 = dynamic_cast<D *>((pb); //pd2 is NULL delete pb; }
    在函數foo中,使用static_cast進行轉換是不被允許的,

    將在編譯時出錯;而使用 dynamic_cast的轉換則是允許的,結果是空指針。

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

    該運算符的用法比較多。

    const_cast
    用法:const_cast< type-id > (exdivssion)
    該運算符用來修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和exdivssion的類型是一樣的。
    常量指針被轉化成非常量指針,并且仍然指向原來的對象;
    常量引用被轉換成非常量引用,并且仍然指向原來的對象;常量對象被轉換成非常量對象。

    Voiatile和const類試。舉如下一例:
    C++代碼 ?
  • 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?????
  • }????
  • 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是兩個不同的對象。

    總結

    以上是生活随笔為你收集整理的C++ reinterpret_cast,const_cast等 显式类型转换总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。