C++11的四种强制类型转换

目录

语法格式

static_cast(静态转换)

dynamic_cast(动态转换)

const_cast(常量转换)

 reinterpret_cast(重解释)


语法格式

cast-name <typename> (expression)

其中cast-namestatic_castdynamic_castconst_cast 和 reinterpret_cast之一,typename为需要转换的目标类型,而expression是被强制转换的值。

static_cast(静态转换)

1、父类到子类的转换,( 进行下行转换,把基类的指针或引用转换为派生类表示)不保证安全。

2、子类到父类的转换,(进行上行转换,把派生类的指针或引用转换成基类表示)保证安全。

3、基本数据类型之间的转换,是否正确需要开发人员来保证。

4、void 类型的空指针,转换成其他类型空指针。

5、可以把任何类型的表达式 转换为 void类型。

static_cast不能转换掉表达式的const、volitale属性。

ps:C++11的移动语义就是的底层实现就是这个

static_cast是直接不允许不同类型的引用进行转换的,因为没有void类型引用可以作为中间介质,这点和指针是有相当大区别的。

static_cast在进行下行转换的时候要子类要有父类的构造函数 不然static_cast会认为他们没有关联就会报错(这个时候会返回错误信息是安全的),这里由于上行转换是隐式类型转换所以不会报错

static的缺点就是:无法消除volitale,const的属性,无法直接对两个不同的类型指针或者引用进行转换(他的转换必须要经过void)还有下行转换没有安全检查

dynamic_cast(动态转换)

dynamic 支持运行指针时,识别指针类型或所引用的对象。

换句话说,它可以在执行期决定真正的类型,如果基类指针真的指向了子类对象,它便返回指子类对象的指针值,否则,则返回空指针。(所以说到底,他就是比static_cast多了个类型检查

1、其他三种都是编译时完成的,dynamic_cast是运行时处理的。

2、不能用于基本数据类型的转换。dynamic_cast只能对指针或引用进行强制转换

3、dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。

4、使用dynamic_cast进行下行转换,基类中一定要有虚函数,否则编译不通过,类中存在虚函数(满足多态),就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。需要有虚表的原因:类中存在虚表,就说明它有想要让基类指针或引用指向派生类对象的情况,dynamic_cast认为此时转换才有意义

5、在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

const_cast(常量转换)

const_cast用于强制去掉const或volitale 特性,但需要特别注意的是const_cast不是用于去除变量的常量性,而是去除指向常数对象的指针或引用的常量性,其去除常量性的对象必须为指针或引用,并且const_cast不支持不同类型指针或引用之间的转换

1、该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

2、常量指针被转化成非常量指针,并且仍然指向原来的对象;

3、常量引用被转换成非常量引用,并且仍然指向原来的对象;

4、常量对象被转换成非常量对象。

ps: C++11里面的adressof 他是获取一个对象的实际地址 他的底层实现其实就是const_cast 去掉const 和 volatile 再用reinterpret_cast 加上 cosnt volatile 

 reinterpret_cast(重解释)

它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。
在使用reinterpret_cast强制转换过程仅仅只是比特位的拷贝,因此在使用过程中需要特别谨慎!

1、改变指针或引用的类型

2、将指针或引用转换为一个足够长度的整型

3、将整型转换为指针或引用类型

 

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值