午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

C++轉(zhuǎn)型操作符

 Fredanf 2012-09-27
 

C++有四種轉(zhuǎn)型操作符,以下小結(jié)一下:

1,static_cast<>()

用得最多的,如果轉(zhuǎn)換的是類(lèi)型,則調(diào)用轉(zhuǎn)型函數(shù):比如int轉(zhuǎn)float,float轉(zhuǎn)int等基本數(shù)據(jù)類(lèi)型的轉(zhuǎn)型,如果是一個(gè)類(lèi),就調(diào)用類(lèi)型轉(zhuǎn)換函數(shù),比如:

#include <iostream>

using namespace std;

class A
{
public:
    explicit A(int _a = 0) : a(_a) {}
    operator int() const
    {
        return a;
    }
private:
    int a;
};
int main()
{
    A a(100);
    int b = static_cast<int>(a);
    cout<<b<<endl;
    system("PAUSE");
    return 0;
};

可以轉(zhuǎn)換一個(gè)基類(lèi)指針到子類(lèi)指針的轉(zhuǎn)型,但是不做動(dòng)態(tài)類(lèi)型檢查,可以不存在虛函數(shù),因此轉(zhuǎn)型可能是不安全的,但是是快速的。

2,dynamic_cast<>()

專(zhuān)門(mén)用于C++類(lèi)的指針轉(zhuǎn)型,且是用于多態(tài)繼承體系中的類(lèi)。public繼承體現(xiàn)了‘is-a’的類(lèi)關(guān)系,一個(gè)基類(lèi)指針,可以指向子類(lèi)對(duì)象,它的子類(lèi)類(lèi)型是動(dòng)態(tài)類(lèi)型,dynamic_cast<>()就是將基類(lèi)指針轉(zhuǎn)型成它動(dòng)態(tài)類(lèi)型的子類(lèi)指針,如果類(lèi)型不對(duì),結(jié)果就是空。

#include <iostream>

using namespace std;

class B
{
public:
    virtual void foo() {
        cout<<"B.foo"<<endl;
    }
};

class D1 : public B
{
public:
    void foo() {
        cout<<"D1.foo"<<endl;
    }
    void foo2() {
        cout<<"D1.foo2"<<endl;
    }
};

class D2 : public B
{
public:
    void foo() {
        cout<<"D2.foo"<<endl;
    }
    void foo3() {
        cout<<"D2.foo3"<<endl;
    }
};
int main()
{
    B *pb = new D2;
    pb->foo();
    D1 *pd1 = dynamic_cast<D1*>(pb);
    if(pd1)
    {
        pd1->foo2();
    }
    D2 *pd2 = dynamic_cast<D2*>(pb);
    if(pd2)
    {
        pd2->foo3();
    }
    delete pb;
    system("PAUSE");
    return 0;
};

(1)必須有虛接口,那么,如果用基類(lèi)指針使用虛接口,則可以動(dòng)態(tài)綁定,不需要轉(zhuǎn)型,就能體現(xiàn)多態(tài);(2)如果是子類(lèi)指針,可以直接給基類(lèi)指針,可以直接使用。所以使用dynamic_cast的情形比較簡(jiǎn)單,就是用基類(lèi)指針使用非虛接口的情形。非虛接口體現(xiàn)了子類(lèi)的特有操作,也就是要確定它的動(dòng)態(tài)類(lèi)型,如上例,給了pb指針,但不知道是D1還是D2,轉(zhuǎn)型后,看結(jié)果是否非空,如果空則表示不是這個(gè)類(lèi)型,然后分情況處理。它相當(dāng)于使用typeid+static_cast,是安全的轉(zhuǎn)型。

3,const_cast<>()

用以去掉‘?dāng)?shù)據(jù)’的常量屬性,常量屬性多體現(xiàn)在指針和引用,因?yàn)槿绻麤](méi)有指針和引用,就不存在不小心修改了不能修改的東西。如

const int a =314;
a=2;//這個(gè)傻瓜編譯器都知道你在忽悠它
int *p = &a;
*p=3;//這兩句,是不是可以成功忽悠你,轉(zhuǎn)了彎修改了不能修改的東西

C++會(huì)報(bào)錯(cuò),因?yàn)?amp;a是const int *,不能將一個(gè)const指針或引用賦給指針或初始化引用。換成這樣就行了:

int *p=const_cast<int*>(&a);

編譯器放給了你這樣的權(quán)力,如果你這樣寫(xiě),表明你能為它的后果負(fù)責(zé),如果出了錯(cuò),如果你做的是導(dǎo)彈火控系統(tǒng),你將會(huì)知道結(jié)果有多嚴(yán)重。

MSDN里有一個(gè)例子,一個(gè)const成員函數(shù)里修改this指針的常量性,這很高明,真的很高明,因?yàn)橥耆珱](méi)有理由使用mutable關(guān)鍵字啦~~const成員函數(shù)的第一個(gè)參數(shù)類(lèi)型是const ClassName*,簡(jiǎn)單的不同。

4,reinterpret_cast

這個(gè)我用得非常少,因?yàn)樘L(zhǎng)了,每次打都不記得。字面意思是重新解釋?zhuān)褪强梢詫⑷魏沃羔樲D(zhuǎn)型成其它指針或者整型類(lèi)型,它是底層的轉(zhuǎn)型,也是不安全的。MSDN里有一個(gè)hash函數(shù)的例子比較‘高層’的運(yùn)用了它。哦,對(duì)了,它不能去掉const屬性。

給一個(gè)我的例子,功能是顯示數(shù)據(jù)的每一個(gè)字節(jié):

#include <cstdlib>
#include <iostream>

using namespace std;

template<typename Functor>
class for_byte
{
public:
    template<typename T>
    void operator()(T & data)
    {
        unsigned char * p = reinterpret_cast<unsigned char*>(&data);
        for(int i=sizeof(T);i>0;--i)
        {
            fun(*p++);
        }
    }
private:
    Functor fun;
};

struct display_bit
{
    void operator()(unsigned char byte)
    {
        printf("%02X",byte);
    }
};

int main(int argc, char *argv[])
{
    for_byte<display_bit> display;
    double x = 3.14;
    int y = -1;
    display(x);
    printf("\n");
    display(y);
    printf("\n");
    display(display);
    printf("\n");
    system("PAUSE");
    return EXIT_SUCCESS;
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多