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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【转载】C++运算符之类型转换

發(fā)布時間:2025/3/15 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】C++运算符之类型转换 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、const_cast:只影響類型修飾符const,volatile 用法:const_cast<type_id>(expression)

??? 該運算符用來修改類型的constvolatile屬性。除了constvolatile修飾之外,type_idexpression的類型是一樣的。

  • 常量指針被轉(zhuǎn)化成非常量指針,并且仍然指向原來的對象;
  • 常量引用被轉(zhuǎn)換成非常量引用,并且仍然指向原來的對象;
  • 常量對象被轉(zhuǎn)換成非常量對象。
二、static_cast
  • 用于類層次結(jié)構(gòu)中基類(父類)和派生類(子類)之間指針或引用的轉(zhuǎn)換。進行上行轉(zhuǎn)換(把派生類的指針或引用轉(zhuǎn)換成基類表示)是安全的;進行下行轉(zhuǎn)換(把基類指針或引用轉(zhuǎn)換成派生類表示)時,由于沒有動態(tài)類型檢查,所以是不安全的。
  • 用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換成char,把int轉(zhuǎn)換成enum。這種轉(zhuǎn)換的安全性也要開發(fā)人員來保證。
  • 把空指針轉(zhuǎn)換成目標(biāo)類型的空指針。
  • 把任何類型的表達式轉(zhuǎn)換成void類型。
注意:static_cast不能轉(zhuǎn)換掉expressionconstvolatile、或者__unaligned屬性 C++中的static_cast執(zhí)行非多態(tài)的轉(zhuǎn)換,用于代替C中通常的轉(zhuǎn)換操作。
三、reinterpret_cast:
  • 操作符修改了操作數(shù)類型,但僅僅是重新解釋了給出的對象的比特模型而沒有進行二進制轉(zhuǎn)換。
  • 所有映射中最危險的
  • static_cast和reinterpret_cast的區(qū)別主要在于多重繼承,比如

[cpp] view plaincopyprint?
  • <span style="font-size: 18px;">classA { public: int m_a;};?
  • classB { public: int m_b;};?
  • classC : public A, public B {};</span>?
  • classA { public: int m_a;}; classB { public: int m_b;}; classC : public A, public B {};

      那么對于以下代碼:

    [cpp] view plaincopyprint?
  • <span style="font-size: 18px;">C c;?
  • printf("%p,%p, %p\r\n", &c,??????????????
  • ??????????????????????? reinterpret_cast<B*>(&c),?
  • ??????????????????????? static_cast<B*>(&c)? );</span>?
  • C c; printf("%p,%p, %p\r\n", &c, reinterpret_cast<B*>(&c),static_cast<B*>(&c) );

      前兩個的輸出值是相同的,最后一個則會在原基礎(chǔ)上偏移4個字節(jié),這是因為static_cast計算了父子類指針轉(zhuǎn)換的偏移量,并將之轉(zhuǎn)換到正確的地址(c里面有m_a, m_b,轉(zhuǎn)換為B*指針后指到m_b處),而reinterpret_cast卻不會做這一層轉(zhuǎn)換。


    四、dynamic_cast:

    • dynamic_cast運算符可以在執(zhí)行期決定真正的類型。如果downcast是安全的(也就說,如果基類指針或者引用確實指向一個派生類對象)這個運算符會傳回適當(dāng)轉(zhuǎn)型過的指針。如果downcast不安全,這個運算符會傳回空指針(也就是說,基類指針或者引用沒有指向一個派生類對象)。
    • 在類層次間進行上行轉(zhuǎn)換時,dynamic_cast和static_cast的效果是一樣的;在進行下行轉(zhuǎn)換時,dynamic_cast具有類型檢查的功能,比static_cast更安全。
    • 進行向下類型轉(zhuǎn)換時,必須是一個指向帶有虛函數(shù)的類類型的指針。這是由于運行時類型檢查需要運行時類型信息,而這個信息存儲在類的虛函數(shù)表,只有定義了虛函數(shù)的類才有虛函數(shù)表。
    • 使用dynamic_cast要付出顯著地運行開銷和內(nèi)存開銷。
    可以參考下面這個例子進行理解:

    [cpp] view plaincopyprint?
  • <span style="font-size: 18px;">Base b;?
  • 00291A8B? lea???????? ecx,[b]???
  • 00291A8E? call??????? Base::Base (291131h)???
  • Base* pb = NULL;?
  • 00291A93? mov???????? dword ptr [pb],0???
  • ?
  • Derived d;?
  • 00291A9A? lea???????? ecx,[d]???
  • 00291A9D? call??????? Derived::Derived (2911C7h)???
  • Derived* pd = NULL;?
  • 00291AA2? mov???????? dword ptr [pd],0???
  • ?
  • pb = &d;?
  • 00291AA9? lea???????? eax,[d]???
  • 00291AAC? mov???????? dword ptr [pb],eax???
  • pd = static_cast<Derived*>(pb);?
  • 00291AAF? mov???????? eax,dword ptr [pb]???
  • 00291AB2? mov???????? dword ptr [pd],eax???
  • ?
  • pd = dynamic_cast<Derived*>(pb);?
  • 00291AB5? push??????? 0???
  • 00291AB7? push??????? offset Derived `RTTI Type Descriptor' (29A018h)???
  • 00291ABC? push??????? offset Base `RTTI Type Descriptor' (29A000h)???
  • 00291AC1? push??????? 0???
  • 00291AC3? mov???????? eax,dword ptr [pb]???
  • 00291AC6? push??????? eax???
  • 00291AC7? call??????? @ILT+640(___RTDynamicCast) (291285h)???
  • 00291ACC? add???????? esp,14h???
  • 00291ACF? mov???????? dword ptr [pd],eax???
  • </span>?
  • Base b; 00291A8B lea ecx,[b] 00291A8E call Base::Base (291131h) Base* pb = NULL; 00291A93 mov dword ptr [pb],0 Derived d; 00291A9A lea ecx,[d] 00291A9D call Derived::Derived (2911C7h) Derived* pd = NULL; 00291AA2 mov dword ptr [pd],0 pb = &d; 00291AA9 lea eax,[d] 00291AAC mov dword ptr [pb],eax pd = static_cast<Derived*>(pb); 00291AAF mov eax,dword ptr [pb] 00291AB2 mov dword ptr [pd],eax pd = dynamic_cast<Derived*>(pb); 00291AB5 push 0 00291AB7 push offset Derived `RTTI Type Descriptor' (29A018h) 00291ABC push offset Base `RTTI Type Descriptor' (29A000h) 00291AC1 push 0 00291AC3 mov eax,dword ptr [pb] 00291AC6 push eax 00291AC7 call @ILT+640(___RTDynamicCast) (291285h) 00291ACC add esp,14h 00291ACF mov dword ptr [pd],eax


    總結(jié)

    以上是生活随笔為你收集整理的【转载】C++运算符之类型转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。