C++类型强制转换

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值