C++类型转换符

C++是一门强类型语言,一般不支持强制类型转换,但本语言内部提供了类型转换符用于不同类型间的转换

1、const_cast:去掉类型的const或volatile属性

常用于:
1、常量指针被转换成非常量指针,仍指向原来的对象
2、常量引用被转换成非常量引用,仍指向原来的对象
3、常量对象被转换成非常量对象
int main(void)
{
    const int a = 100;
    //a = 200;  直接修改const类型,编译错误
    int &b = const_cast<int&>(a);
    b = 200; //正确
}

2、static_cast:类似域c风格的强制转换,无条件转换,静态类型转换。

常用于:
1、父类和子类之间的转换:其中子类指针转换成父类指针是安全的。但反之不安全
注:父类与子类中之间的动态转换建议使用dynamic_cast
2、基本类型之间的转换,如:enum、int、float、int、char等
3、把空指针转换成目标类型的空指针
4、把任何类型的表达式转换成void类型
注:static_cast不能进行无关类型指针的转换(如:没有关联的类之间的转换)
int main(void)
{
    int n = 6;
    double d = static_cast<double>(n); //基本类型的转换

    int *pn = &n;
    //double *dd = static_cast<double*>(&n); 错误,不可进行无关类型指针的转换
    void *p = static_cast<void*>(pn); //把任意类型转换成void类型
}

3、reinterpret_cast:主要用于指针的转换

转换的类型必须是一个指针、引用、算数类型、函数指针或者成员指针。

注:最普通的用途就是函数指针类型之间的转换。

#include <iostream>
using namespace std;

typedef void (*FunPtr)(int x,int y);

int add(int x,int y)
{
    cout << x + y << endl;
}

void fun(int x,int y,FunPtr pp)
{
    pp(x,y);
}

int main(void)
{
    FunPtr p = reinterpret_cast<FunPtr>(add);
    fun(2,3,p);

    return 0;
}

4、dynamic_cast:有条件转换,动态类型转换,运行时进行类型安全检查(转换失败返回NULL)

常用于:
1、安全的父类和子类之间的转换
2、必须要有虚函数
3、相同父类不同子类之间的交叉转换,但结果是NULL
注:当转换时不安全是自动置NULL
#include <iostream>
using namespace std;

class A
{
public:
    virtual void fun()
    {
        cout << "void A::fun()" << endl;
    }
};
class B:public A
{
public:
    void fun()
    {
        cout << "void B::fun()" << endl;
    }
};
int main(void)
{
    A *a = new A;
    B *b = dynamic_cast<B*>(a);

    if(b == NULL)
    {
        cout << "================" << endl; //此条语句会执行
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Star星屹程序设计

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值