C++ 四种类型转换的介绍

C++标准有四种类型转换,分别是const_cast、static_cast、dynamic_cast和reinterpret_cast

需要提醒大家的是:带有转型的设计大部分都是不好的,所以在需要用转型的时候大家可以考虑下尽量采用不转型的方法来替代!

1、const_cast

去掉类型的const属性,这个应该很好理解,只有这个转型能把const属性去掉

比如:

Base a;
const Base& refA = a;
const_cast<Base&>(refA).DoSomething(); // DoSomething为非const成员函数,需去掉const属性调用

2、static_cast、dynamic_cast

这两个转型放在一起介绍,因为在某些情况两个转型可以通用,

static_cast的主要用途:

  • 用于基本数据类型的转换,如short、int、double、float、bool、char、枚举等类型的转换
  • void*和任何类型的指针的互相转换,在多线程参数的传递经常用到的
  • 非const对象转换为const对象

static_cast和dynamic_cast区别:

  • static_cast:非指针或者引用对象,static_cast可将派生类转换为基类,不能将基类转换为派生类,指针或者引用可以用static_cast将基类转为派生类
  • dynamic_cast:基类与派生类互相转换,但是只能用于指针或者引用对象

注意:用dynamic_cast必要要求基类有虚函数,static_cast无此限制,对于指针或者引用,基类转换为派生类最好用dynamic_cast,dynamic_cast比较安全,转换失败会得到NULL,不会出现不安全的指针,但是dynamic_cast速度慢,如果在性能敏感的程序中,在大量循环中可以考虑用static_cast代替dynamic_cast,但是最好确保基类是指向派生类的指针,可以自己权衡利弊做决定使用哪个!

Derive d;
Base b;
Base *pB = &b;
Derive *pDeriveD = dynamic_cast<Derive*>(pB); // pDeriveD为NULL
Derive *pStaticCastD = static_cast<Derive*>(pB); // pStaticCastD是不安全的

3、reinterpret_cast

reinterpret_cast意图执行低级转型,只能用于指针或者引用,且理论上可以用于任何指针类型的转换,且不可移植

比如char* pStr存储了unicode编码的字符串,可以reinterpret_cast<wchar_t*>(pStr)将char*转换为wchar_t*,其实也可用reinterpret_cast将基类和派生类相互转换,但此时和static_cast一样,不保证安全性

原文地址:https://www.cnblogs.com/hui277/p/3527081.html