首页 > 技术文章 > c++ cast

XDU-mzb 2021-06-07 15:12 原文

pointer_cast

很刁钻的知识点,用来处理智能指针的cast,效果和使用范围等效于简单cast,不过加智能指针的壳
1.static_pointer_cast
2.dynamic_pointer_cast
3.const_pointer_cast
4.reinterpret_pointer_cast

reinterpret_cast

效果

允许将任何指针转换为任何其他指针类型。 也允许将任何整数类型转换为任何指针类型以及反向转换。

注意

1.本质是一个编译期指令,实际动作可能取决于编译器,虽然功能最强但风险最大,且失去了移植性。
2.可以去除指针的顶层const,不能去除底层const
3.在用于继承时,有一些坑 https://www.cnblogs.com/hiwoshixiaoyu/p/10035049.html
4.reinterpret_cast 运算符不能丢掉 const、volatile 或 __unaligned 特性。有关移除这些特性的详细信息,右转 const_cast

用途

1.hash地址
2.做一些特殊的系统调用,需要把整数转化为函数指针
3.当你不得不用这东西的时候,多半是你的设计有问题

const_cast

以后再填 volatile 、__unaligned的坑

效果

const_cast主要用来提供一个去除(指针、引用)底层const的接口,并不能改变源对象的底层const属性

注意

1.测试的时候用一个指针间接输出...不然编译器会优化掉...
2.绕开编译器修改常量是个UB

用途

1.采用一些c、第三方的库的时候,对应类型
2.有些类成员函数没有写const重载,const 对象无法调用,去除之后就能调用了
3.当你不得不用const_cast的时候,多半是你的设计有问题

dynamic_cast

效果

支持运行时识别指针或引用,用于类继承层次间的指针或引用转换。主要还是用于执行"安全的向下转型"
需要运行时开销,依赖于RTTI信息,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,

用途 :运行时安全的向下转换

1.基类指针所指对象是派生类类型的,这种转换是安全的;
2.基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0;

注意

1.向下转换指针失败,会返回nullptr,向下转换引用失败,会抛出bad_cast异常
2.基类必须有一个虚函数,否则编译不过...把析构函数弄成虚的即可
3.向上转型的时候和static_cast等效...dynamic_cast消耗比较大

static_cast

效果

编译期进行不安全的类型转换

用途

1.不安全的类层次向下转换,也就是不进行运行时检查
2.安全的0开销类层次向上转换,比如CTRP实现静态多态
3.基本的数值类型转换...这个用c-style方便一点...
4.进行常用的各种类型转换...对用户自定义类转换的时候,会尝试调用构造函数

注意

1.static_cast不能转换掉expression的const、volatile、或者__unaligned属性
2.static_cast完全靠程序员自己去保证转换的正确性

推荐阅读