c++中的四种强制类型转换关键字

1、reinterpret_cast

reinterpret_cast < type-id > ( expression )

reinterpret_cast转换一个指针为其它类型的指针。它也允许从一个指针转换为整数类型。反之亦然。
这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。
如果情况是从一个指针到整型的拷贝,内容的解释是系统相关的,所以任何的实现都不是方便的。一个转换到足够大的整型能够包含它的指针是能够转换回有效的指针的。

int main()
{
    A* a = new A;
    cout << typeid(a).name() << endl;
    B* b = reinterpret_cast<B*>(a);
    cout << typeid(b).name() << endl;
}

结果如下:
这里写图片描述

2、static_cast

static_cast < type-id > ( expression )

static_cast允许执行任意的隐式转换和相反转换动作。(即使它是不允许隐式的)
应用到类的指针上,意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类。
在这最后例子里,被转换的父类没有被检查是否与目的类型相一致。

class A
{};
class B
{};
class Base
{};
class Derive :public Base
{};
//...
Derive* d = new Derive;
Base* b = static_cast<Base*>(d);
cout << typeid(b).name() << endl;
Base* b1 = new Base;
Derive* d1 = static_cast<Derive*>(b1);
cout << typeid(d1).name() << endl;

结果如下:
这里写图片描述

static_cast除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换:

double _a = 13.14;
int  _b= static_cast<int>(_a);

3、dynamic_cast
dynamic_cast只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(注:即隐式转换的相反过程),dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有效的完整对象。
检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL.

class _Base
{
    virtual void Fun()
    {}
};
class _Derive :public _Base
{};
//...
_Base* _b1 = new _Base;
_Base* _b2 = new _Derive;
_Derive* _d2 = dynamic_cast<_Derive*>(_b2);
cout << typeid(_d2).name() << endl;
_Derive* _d1 = dynamic_cast<_Derive*>(_b1);//错误,会返回NULL
cout << typeid(_d1).name() << endl;

结果如下:

由上图可见,_d1不是有效完整的指针(基类的指针不能被转换为派生类),所以会为他将它的值赋为NULL,程序将会崩溃。
如果一个引用类型执行了类型转换并且这个转换是不可能的,一个bad_cast的异常类型被抛出。

4、 const_cast
这个转换类型操纵传递对象的const属性,或者是设置或者是移除。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值