• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            【轉(zhuǎn)】static_cast、dynamic_cast、reinterpret_cast和const_cast之間的區(qū)別

            原文出處

            C-style cast舉例:

             int i;

             double d;

             i = (int) d;

             

            上面的代碼就是本來(lái)為double類(lèi)型的d,通過(guò)(int)d將其轉(zhuǎn)換成整形值,并將該值賦給整形變量i (注意d本身的值并沒(méi)有發(fā)生改變)。這就是典型的c-style類(lèi)型轉(zhuǎn)換。

             

            下面是一個(gè)簡(jiǎn)單的程序:

            #include <iostream>

            using namespace std;

             

            int main(void)

            {

                     int i;

                     double d = 11.29;

             

                     i = (int)d;

                     cout << i << endl;

                     cout << d << endl;

             

                     return 0;

            }

            輸出結(jié)果:

            11

            11.29

             

            我們發(fā)現(xiàn)d值本身并沒(méi)有發(fā)生任何變化。

             

            在簡(jiǎn)單的情況下,上面這種類(lèi)型轉(zhuǎn)換可以很好地工作,但在C++中往往還是不夠的,為此ANSI-C++新標(biāo)準(zhǔn)定義的四個(gè)轉(zhuǎn)換符,即static_castdynamic_castreinterpret_castconst_cast。同時(shí)在C++環(huán)境中,原先的C-Style的類(lèi)型轉(zhuǎn)換仍舊可以使用。

             

            1) static_cast

                用法:static_cast <typeid> (expression)

                說(shuō)明:該運(yùn)算符把expression轉(zhuǎn)換為typeid類(lèi)型,但沒(méi)有運(yùn)行時(shí)類(lèi)型檢查來(lái)確保轉(zhuǎn)換的安全性。

                用途:

                a) 用于類(lèi)層次結(jié)構(gòu)中基類(lèi)和派生類(lèi)之間指針或者引用的轉(zhuǎn)換。up-casting (把派生類(lèi)的指針或引用轉(zhuǎn)換成基類(lèi)的指針或者引用表示)

                安全的;down-casting(把基類(lèi)指針或引用轉(zhuǎn)換成子類(lèi)的指針或者引用)是不安全的。

                b) 用于基本數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換,如把int轉(zhuǎn)換成char,這種轉(zhuǎn)換的安全性也要由開(kāi)發(fā)人員來(lái)保證。

                c) 可以把空指針轉(zhuǎn)換成目標(biāo)類(lèi)型的空指針(null pointer)

                d) 把任何類(lèi)型的表達(dá)式轉(zhuǎn)換成void類(lèi)型。

                注意: static_cast不能轉(zhuǎn)換掉expressionconstvolitale或者__unaligned屬性。

             

            2) dynamic_cast

                用法:dynamic_cast <typeid> (expression)

                說(shuō)明:該運(yùn)算符把expression轉(zhuǎn)換成typeid類(lèi)型的對(duì)象。typeid必須是類(lèi)的指針、類(lèi)的引用或者void*。如果typeid是類(lèi)的指針類(lèi)型,

                    那么expression也必須是指針,如果typeid是一個(gè)引用,那么expression也必須是一個(gè)引用。一般情況下,dynamic_cast

                    于具有多態(tài)性的類(lèi)(即有虛函數(shù)的類(lèi))的類(lèi)型轉(zhuǎn)換。

             

                           dynamic_cast依賴(lài)于RTTI信息,其次,在轉(zhuǎn)換時(shí),dynamic_cast會(huì)檢查轉(zhuǎn)換的source對(duì)象是否真的可以轉(zhuǎn)換成target類(lèi)型,

                   這種檢查不是語(yǔ)法上的,而是真實(shí)情況的檢查。先看RTTI相關(guān)部分,通常,許多編譯器都是通過(guò)vtable找到對(duì)象的RTTI信息

                   的,這也就意味著,如果基類(lèi)沒(méi)有虛方法,也就無(wú)法判斷一個(gè)基類(lèi)指針變量所指對(duì)象的真實(shí)類(lèi)型,這時(shí)候,dynamic_cast只能

                   用來(lái)做安全的轉(zhuǎn)換,例如從派生類(lèi)指針轉(zhuǎn)換成基類(lèi)指針。而這種轉(zhuǎn)換其實(shí)并不需要dynamic_cast參與。也就是說(shuō),dynamic_cast

                   是根據(jù)RTTI記載的信息來(lái)判斷類(lèi)型轉(zhuǎn)換是否合法的。

             

               用途:主要用于類(lèi)層次之間的up-castingdown-casting,還可以用于類(lèi)之間的交叉轉(zhuǎn)換。在進(jìn)行down-casting時(shí),dynamic_cast

                    具有類(lèi)型檢查的功能,比static_cast更安全。檢測(cè)在運(yùn)行時(shí)進(jìn)行。如果被轉(zhuǎn)換的指針不是一個(gè)被請(qǐng)求的有效完整的對(duì)象指針,

                    返回值為NULL。當(dāng)用于多態(tài)類(lèi)型時(shí),它允許任意的隱式類(lèi)型轉(zhuǎn)換以及相反過(guò)程。不過(guò),與static_cast不同,在后一種情況里

                    (注:即隱式轉(zhuǎn) 換的相反過(guò)程),dynamic_cast會(huì)檢查操作是否有效。也就是說(shuō),它會(huì)檢查轉(zhuǎn)換是否會(huì)返回一個(gè)被請(qǐng)求的有

                    效的完整對(duì)象。

                注意:dynamic_cast不能轉(zhuǎn)換掉expressionconstvolitale或者__unaligned屬性。

             

            3)   reinterpret_cast

                 用法:reinterpret_cast <typeid>(expression)

                 說(shuō)明:轉(zhuǎn)換一個(gè)指針為其他類(lèi)型的指針,也允許將一個(gè)指針轉(zhuǎn)換為整數(shù)類(lèi)型,反之亦然。這個(gè)操作符能夠在非相關(guān)的類(lèi)型之間進(jìn)行

                    轉(zhuǎn)換。操作結(jié)果只是簡(jiǎn)單的從一個(gè)指針到別的指針的值的二進(jìn)制拷貝,在類(lèi)型之間指向的內(nèi)容不做任何類(lèi)型的檢查和轉(zhuǎn)換。這

                    是一個(gè)強(qiáng)制轉(zhuǎn)換。使用時(shí)有很大的風(fēng)險(xiǎn),慎用之。

                 注意:reinterpret _cast不能轉(zhuǎn)換掉expressionconstvolitale或者__unaligned屬性。

             

            4)   const_cast

                 用法:const_cast<typeid>(expression)

                 說(shuō)明:這個(gè)類(lèi)型操縱傳遞對(duì)象的const屬性,或者是設(shè)置或者是移除。如:

                       Class C{…}

                       const C* a = new C;

                       C* b = const_cast<C*>(a);

                       如果將上面的const_cast轉(zhuǎn)換成其他任何其他的轉(zhuǎn)換,編譯都不能通過(guò),出錯(cuò)的信心大致如下:

                       “…cannot convert from 'const class C *' to 'class C *'”

              

                 下面的代碼是4casting方法的典型用法示例:

                 #include <iostream>

                 using namespace std;

             

                 class Base

                 {

                 public:

                     int _base;

                     virtual void printinfo()

                     {

                          cout << _base << endl;

                     }

                 };

             

                 class Derived : public Base

                 {

                 public:

                     int _derived;

                     virtual void printinfo()

                     {

                          cout << _derived << endl;

                     }

                 };

             

                 int main(void)

                 {

                     Base b1;

                     Derived d1;

                     int aInt = 10;

                     long aLong = 11;

                     float aFloat = 11.11f;

                     double aDouble = 12.12;

             

                     Derived* pd = static_cast<Derived*>(&b1);                           // down-casting          不安全

                     Base* pb = static_cast<Base*>(&d1);                                   // up-casting                安全

                     Derived& d = static_cast<Derived&>(b1);                             // down-casting          不安全

                     Base& b = static_cast<Base&>(d1);                                      // up-casting                安全

             

                     aInt = static_cast<int>(aFloat);                                                // 基本數(shù)據(jù)類(lèi)型轉(zhuǎn)換

                     void* sth = static_cast<void*>(&aDouble);                            // double指針類(lèi)型轉(zhuǎn)換成void指針類(lèi)型

                     double* bDouble = static_cast<double*>(sth);                    // void指針類(lèi)型轉(zhuǎn)換成double指針類(lèi)型

                     cout << *bDouble << endl;

             

                     Base* pb1 = dynamic_cast<Base*>(&d1);

                     //Derived* pd1 = dynamic_cast<Derived*>(&b1);                 // 編譯時(shí)有warning,運(yùn)行時(shí)出錯(cuò)

             

                     int bInt = reinterpret_cast<int>(pb1);                                       // 將地址或指針轉(zhuǎn)換成整數(shù)

                     cout << bInt << endl;

                     pb1 = reinterpret_cast<Base*>(bInt);                                     // 將整數(shù)轉(zhuǎn)換成地址或指針

             

                     int* cInt = reinterpret_cast<int*>(&aFloat);                             // 這個(gè)轉(zhuǎn)換的結(jié)果會(huì)出乎意料

                     cout << (int)*cInt << endl;

             

                     const Base* bBase = new Base();

                     Base* cBase = const_cast<Base*>(bBase);

                     //Base* dBase = dynamic_cast<Base*>(bBase);                // 不能通過(guò)編譯

                     //Base* eBase = static_cast<Base*>(bBase);                     // 不能通過(guò)編譯

                     //Base* fBase = reinterpret_cast<Base*>(bBase);             // 不能通過(guò)編譯

             

                     return 0;

            }

            posted on 2012-07-07 10:06 鐘謝偉 閱讀(1159) 評(píng)論(1)  編輯 收藏 引用

            評(píng)論

            # re: 【轉(zhuǎn)】static_cast、dynamic_cast、reinterpret_cast和const_cast之間的區(qū)別 2012-07-09 20:51 東南枝

            過(guò)來(lái)打個(gè)招呼  回復(fù)  更多評(píng)論   


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2012年5月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(1)

            隨筆檔案

            IT網(wǎng)站

            My Friends

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产精品免费看久久久| 久久久久久国产精品免费免费| 国产情侣久久久久aⅴ免费| 91精品国产色综合久久| 久久这里只有精品视频99| 婷婷久久久亚洲欧洲日产国码AV | 麻豆亚洲AV永久无码精品久久| 久久99国内精品自在现线| 久久精品国产精品亜洲毛片| 麻豆一区二区99久久久久| 亚洲?V乱码久久精品蜜桃| 国产成人AV综合久久| 久久香蕉国产线看观看精品yw| 久久久无码精品午夜| 青草影院天堂男人久久| 久久久一本精品99久久精品88| 亚洲午夜精品久久久久久app| 国内精品伊人久久久久| 国产亚洲精品久久久久秋霞| 亚洲国产精品一区二区三区久久| 免费精品99久久国产综合精品| 亚洲AV无码1区2区久久| 无码国内精品久久人妻麻豆按摩| 久久国产精品99精品国产987| 久久久久亚洲AV无码麻豆| 精品久久久无码人妻中文字幕| 要久久爱在线免费观看| 久久人人爽人爽人人爽av| 国产精品久久久99| 国产精品欧美久久久久无广告| 久久免费国产精品一区二区| 精品九九久久国内精品| 久久亚洲欧美日本精品| 久久综合九色综合欧美狠狠| 久久99国产精品久久99果冻传媒| 国内精品久久久久影院优| AV色综合久久天堂AV色综合在 | 四虎国产精品免费久久5151| 高清免费久久午夜精品| AV无码久久久久不卡网站下载| 久久久久久久久无码精品亚洲日韩 |