【转载】C++运算符之类型转换
生活随笔
收集整理的這篇文章主要介紹了
【转载】C++运算符之类型转换
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、const_cast:只影響類型修飾符const,volatile
用法:const_cast<type_id>(expression)
三、reinterpret_cast:<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 {}; <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) ); <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
??? 該運算符用來修改類型的const或volatile屬性。除了const或volatile修飾之外,type_id和expression的類型是一樣的。
- 常量指針被轉(zhuǎn)化成非常量指針,并且仍然指向原來的對象;
- 常量引用被轉(zhuǎn)換成非常量引用,并且仍然指向原來的對象;
- 常量對象被轉(zhuǎn)換成非常量對象。
- 用于類層次結(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類型。
三、reinterpret_cast:
- 操作符修改了操作數(shù)類型,但僅僅是重新解釋了給出的對象的比特模型而沒有進行二進制轉(zhuǎn)換。
- 所有映射中最危險的
- static_cast和reinterpret_cast的區(qū)別主要在于多重繼承,比如
那么對于以下代碼:
[cpp] view plaincopyprint?前兩個的輸出值是相同的,最后一個則會在原基礎(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)存開銷。
總結(jié)
以上是生活随笔為你收集整理的【转载】C++运算符之类型转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net中创建一个简单的自定义控件
- 下一篇: 成绩出来,C++专业课没问题