C++四种强制类型转换关键字

C++四种强制类型转换关键字有:

static_cast   编译时
dynamic_cast  运行时
const_cast    编译时
reinterpret_cast  编译时

在早期的C++语言中,显式的进行强制类型转换包含两种形式:

type(expr);  //函数形式的强制类型转换
(type)expr;  //C语言风格的强制类型转换

根据所涉及的类型不同,旧式的强制类型转换分别具有与const_cast、static_cast和reinterpret_cast相似的行为。
新式的强制类型转换更加清晰明了,一旦转换过程出现问题,便于追踪。

static_cast
任何具有明确定义的类型,只要不包含底层const,都可以使用。
主要用于基本类型之间和具有继承关系的类型之间的转换。

//基本类型转换
int i = 0;
double d = static_cast<double>(i);  //相当于double d = double(i);
//转换继承类的对象为基类对象
class Base{};
class Derived: public Base{};
Derived d;
Base b = static_cast<Base>(d);  //相当于Base(d)

const_cast
一种涉及const的强制类型转换。将底层const对象转换为对应的非常量类型,或者执行相反的操作。注意此转换只改变const(常量)属性,不改变类型

const int *pci = 0;
//将常量转换为非常量
int *pk = const_cast<int*>(pci);  //相当于int *pk = int*(pci);
const A* pca = new A;
A *pa = const_cast<A*>(pca); //相当于A *pa = A*(pca);

出于安全性考虑,const_cast无法将非指针常量转换为普通变量。

dynamic_cast
1.只能在类继承对象的指针或引用之间进行类型转换,和继承及运行时类型识别一起使用。
2.没有继承关系,但被转换类有虚函数。 否则,其他操作不能通过编译。

此转换是在运行时进行转换分析的,并非在编译时进行,与static_cast相对,是动态转换,区别于其他三种类型转换操作。

进行转换时,会根据当前运行时类型信息,判断类型对象之间的转换是否合法。dynamic_cast的指针转换失效,可通过是否为NULL检测,引用转换则抛出一个bad_cast异常。

class Base{};
class Derived: public Base{};
//派生类指针转换为基类指针
Derived *pd = new Derived;
Base *pb = dynamic_cast<Base>(pd);
//检测
if(!pb){
  std::cout << "Failed Cast!";
}
//没有继承关系,但被转换类有虚函数
class A{
    virtual ~A();
};
class B{};
A *pa = new A;
B *pb = dynamic_cast<B>(pa);

reinterpret_cast
把运算对象的内容重新解释为另外一种类型,这种强制类型转换本质上依赖于机器而且非常危险。不能用于非指针类型的转换。

//基本类型指针的类型转换
double d = 9.2;
double *pd = &d;
int *pi = reinterpret_cast<int*>(pd); //相当于int *pi = (int*)pd;
//不相关的类的指针类型转换
class A{};
class B{};
A *pa = new A;
B *pb = reinterpret_cast<B*>(pa); //相当于B *pb = (B*)pa;
//指针转换为整数
int *pi = 0;
long L = reinterpret_cast<long>(pi);  //相当于long L = (long)pi;

强制类型转换干扰了正常的类型检查,在C++primer中建议程序员慎用。每次书写了一条强制类型转换语句,都应该反复斟酌能否以其他方式实现相同的目标。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值