您的位置:首页 > 编程语言 > C语言/C++

C++类型强制转换

2016-04-11 16:50 603 查看
C++有以下几种类型转化:

1.static_cast

2.reinterpret_cast

3.const_cast

4.dynamic_cast

static_cast:用于隐式类型的转化。

如:

float a = 3.5;

int b = 5;

int *p = NULL;

a = static_cast<float>(b);

b = static_cast<int>(a);

//注意这里malloc的返回值是void *类型

//不允许将void *类型赋值给基本类型指针,却可以将基本类型指针赋值给void *类型。

p = static_cast<int *>malloc(sizeof(int));

reinterpret_cast:用于无隐式的类型转化,static_cast已不可用的情况

如:

char *p1;

int *p2;

p1 = reinterpret_cast<char*>(p2);

3.const_cast:脱常,const_cast<type>,这里的type必须是指针或引用或指向变量的指针。

如:


void function(int &a)

{

}


int main()

{

const int a = 10;

function(const_cast<int&>(a));

}

这里可以将const int类型的变量作为实参赋给int&类型,这就是一种const_cast的使用,但是使用const_cast的结果是不确定的,不推荐使用。

如:

int main()

{

const int ca = 10;

int& a = const_cast<int&>(ca);

cout<<"a = "<<a<<",&a = "<<&a<<",ca = "<<ca<<"&ca"<<&ca<<endl;

a = 50;

cout<<"a = "<<a<<",&a = "<<&a<<",ca = "<<ca<<"&ca"<<&ca<<endl;

struct test

{

int value;

};

const test m_test = {15};

test* p = const_cast<test*>(&m_test);

cout<<"p->value = "<<p->value<<", m_test.value = "<<m_test.value<<endl;

p->value = 20;

cout<<"p->value = "<<p->value<<", m_test.value = "<<m_test.value<<endl;

}

执行的结果:

a = 10,&a = 0x28fe94,ca = 10&ca0x28fe94

a = 50,&a = 0x28fe94,ca = 10&ca0x28fe94

p->value = 15, m_test.value = 15

p->value = 20, m_test.value = 20

4.dynamic_cast动态类型转化,转化通常使用在类继承的相关操作中,需构成多态,这样动态转化才有意义。如下代码:

#include <iostream>

class A

{

public:

    virtual void fun1()

    {

        std::cout<<"A::fun1()"<<std::endl;

    }

    ~A(){}

};

class B:public A

{

public:

    void fun()

    {

        std::cout<<"B::fun()"<<std::endl;

    }

};

class C

{

public:

    void fun()

    {

        std::cout<<"C::fun()"<<std::endl;

    }

};

int main(void)

{

    B b;

    A* pa = &b;

    B* pb = dynamic_cast<B*>(pa);

    C* pc = dynamic_cast<C*>(pa);

    if(pb != NULL)

    {

        pb->fun();

    }

    if(pc != NULL)

    {

        pc->fun();

    }

    return 0;

}

打印结果:

B::fun()

根据结果显示的内容可以知道pb不等与NULL,而pc等于NULL。由于class B继承于class A,并且A中有虚函数,pa地址等于&b,所以使类B的地址,只不过是A*类型,所以将pa动态转化成pb没有问题。(如果不动态转化,不能将父类指针传给子类指针。)此时pb就是&b的值。

而class C由于没有继承成class A,故动态转化并没有实际意义,此时转化使成功的,但是返回的使NULL,故也不能调用fun()。(但是有些编译器是可以的,并且也能打印C::fun(),但是调试都可以发现pc的值是NULL)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 类型转化