C++中的四种类型转换解析

C++中按照不同作用的转换类型将其细分为四个显示类型转换符号static_cast, const_cast, reinterpret_castdynamic_cast

相对于C语言强制转换的优点:

这种新类型的强制转换可以提供更好的控制强制转换过程允许控制各种不同种类的强制转换。能更清晰的表明它们要干什么。

1.static_cast(用于基本类型的强制转换)

  • 能用于执行类型定义的显式转换,以及基础类型之间的标准转换。
double i=12.342;
int j=static_cast<int>(i);
  • 允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类。
class Base {};
class Derived : public Base {};

Base *a  = new Base;
Derived *b = static_cast<Derived *>(a);

2.reinterpret_cast(用于不同类型之间的指针之间的转换)

  • 转换一个指针为其它类型的指针,操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。
class A {};
class B {};

A * a = new A;
B * b = reinterpret_cast<B *>(a);
  • 这个操作符能够在非相关的类型之间转换(从一个指针转换为整数类型)。当情况是从一个指针到整型的拷贝,内容的解释是系统相关的,所以任何的实现都不是方便的。一个转换到足够大的整型能够使指针转换回有效的指针的。

3.const_cast(去除指针或者引用的const或volatile属性)

void Test ()
{
 const int a = 2;
 int* p = const_cast< int*>(&a );
 *p = 3;
 cout<<a <<endl;//3
}

4.dynamic_cast(用于多态类型之间的类型转换)

  • dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换).
  • 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
  • 向下转型:父类对象指针/引用- >子类指针/引用(用dynamic_cast转型是安全的)
class Base { virtual fun() {} };
class Derived : public Base {};

Base* b1 = new Derived;
Base* b2 = new Base;

Derived* d1 = dynamic_cast<Derived *>(b1);          // succeeds
Derived* d2 = dynamic_cast<Derived *>(b2);          // fails: returns 'NULL'

注意:

  • dynamic_cast只能用于含有虚函数的类
  • dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
  • 与static_cast不同,它会检查转换是否会返回一个被请求的有效的完整对象。
  • 检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值