C++强制类型转换

C++类型转换

C语言风格的类型转换

type(expr); // 函数形式的强制类型转换
(type)expr; // C语言风格的强制类型转换

C++风格的类型转换

cast-name<type>(expression)

C++风格的类型转换提供了4类型转换操作符来应对不同场合的应用

类型转换操作符 应用场景
static_cast 一般类型的转换
dynamic_cast 通常在基类和派生类之间转换时使用
const_cast 主要针对 const 的转换
reinterpret_cast 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整型数

1、static_cast

static_cast 用于内置的数据类型,还有具有继承关系的指针或者引用

int a = 97;

char c = static_cast<char>(a);

//打印结果为 a

2、dynamic_cast

dynamic_cast 只能转换具有继承关系的指针或引用,在转换前会进行对象类型检查,是通过“运行时类型检查”来保证安全性的,只能子类型转换成基类型

dynamic_cast 不能用于将非多态基类的指针或引用强制转换为派生类的指针或引用——这种转换没法保证安全性,只好用 reinterpret_cast 来完成。

Animal* ani = NULL;

//父类指针可以转换为子类指针(从小到大,类型不安全)
Cat* cat = dynamic_cast<Cat*>(ani);  //错误

//子类指针可以转换为父类指针(从大到小,类型安全)
Animal* ani = dynamic_cast<Animal*>(cat);  //正确

3、const_cast

const_cast用于移除类型的constvolatile__unaligned属性。

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

const int *p;
int *p = const_cast<int*>(p);

4、reinterpret_cast

reinterpret_cast是真正的强制类型转换,在编译期完成,可以转换任何类型的指针,所以非常不安全,一般情况下不建议使用。

reinterpret_cast 体现了 C++ 语言的设计思想:用户可以做任何操作,但要为自己的行为负责。

int *p;
char *p = reinterpret_cast<char*>(p);

小结

  • 能够不要使用类型转换尽量不要用类型转换,尽可能的只用原本的子类类型。
  • 需要使用类型转换的时候,可以尽量避免使用 reinterpret_cast 因为他过于自由,安全性太差。
  • 能够不去强行把 const_cast 转换的情况就尽量不要去破坏常量的属性。
  • 能用 static_cast 的地方,不要去使用 dynamic_cast
posted @ 2023-08-21 21:37  洋綮  阅读(12)  评论(0)    收藏  举报