-
6 C++ 四种类型转换 为什么要搞这么多种转换呢?
-
# 1 将类型转换进行分级分类 --> 不同类型的 强转 风险级别显然不同 # 2 方便 发生错误时 检查 强制转换 匹配字符串_cast --> 进行grep即可 # 强制类型转换是引发程序运行时错误的一个原因 # 因此在程序出错时,可能就会想到是不是有哪些强制类型转换出了问题 # 如果采用C语言的老式做法 # 要在程序中找出所有进行了强制类型转换的地方 # 显然是很麻烦的,因为这些转换没有统一的格式 # 而用 C++ 的方式,则只需要查找_cast字符串就可以了 # 甚至可以根据错误的类型,有针对性地专门查找某一种强制类型转换 # 例如,怀疑一个错误可能是由于使用了 reinterpret_cast 导致的 # 就可以只查找reinterpret_cast字符串
-
四种_cast
- const_cast const int i = 0; int* pi = const_cast<int*>(&i); i=1; 去除const限定
- 使用场景 1 , 设计者(很烂的设计者) 只给出了 void func (type* )的接口 (即便实际上 func 内部 并未改变 指针内容)那么 我们 有一个 const type* p,如果需要使用这个接口 ,就必须强转 去掉const限定
- 至于 在去掉const限定之后 强行修改 内容 ,后果 是不可预知的, 看编译器心情
- static_cast 低风险转换 基本等同于 隐式转换(此外 涉及 父转子(不安全))
- 整型 与 浮点 ; 整型 与 char ;
- void* 与 任何其他指针 互转 (但是 任何其他指针 之间 不能互转 )
- 子类指针 转 父类 (本身就安全)
- 父类指针 转 子类 (本身不安全 , 隐式转换 不通过 但是可以static_cast <—不推荐 )
- int i=1; float f=i; ## <—不推荐 推荐 --> ### int i=1; float f=static_cast<float>(i); 因为更明确 , 且发生问题更容易定位
- dynamic_cast 进行 运行时 检查RTTI(仅限于 含有虚表的 类 与 子类) 如果 父转子 不成功(这就是程序设计者 的问题了)
- 指针 会 置为 nullptr
- 引用 因为不存在 空引用 ,会抛出异常 std::bad_cast
- 运行时 检查 可能??耗费大量性能 慎用<–并不认为如此,继承关系 能够有多复杂呢?
- RTTI 原理: 探查虚表 ,其中包含了 这个对象的 真实信息
- const_cast const int i = 0; int* pi = const_cast<int*>(&i); i=1; 去除const限定
C++类型转换
最新推荐文章于 2020-08-29 15:54:54 发布