1、static_cast
作用:主要用于C++中内置的基本数据类型之间的转换,例如:enum、struct、int、char、float等
注意:
-
static_cast没有运行时类型检查来保证转换的安全性,需要程序猿自己判断转换是否安全;
int x = -1; uint y = static_cast<uint>(x); //转换错误 double x = 1.23; int y = static_cast<int>(x); //转换丢失精度 -
static_cast向上转换(派生类指针转换为基类指针)安全,向下转换(基类指针转换为派生类指针)不安全;
因为派生类包含基类信息,所以向上转换(只能调用基类的方法和成员变量),一般是安全的;而基类中没有派生类的任何信息,向下转换后会用到派生类的方法和成员变量,这些基类都没有,很容易指向不存在的空间;
2、dynamic_cast
作用:主要用于类层次间的上行转换和下行转换
- 在进行上行转换时,dynamic_cast和static_cast的效果是一样的;
- 在进行下行转换时,dynamic_cast具有类型检查的功能,比static更安全;
注意:
-
dynamic_cast是运行时处理的,要进行类型检查;
-
不能用于内置的基本数据类型的强制转换;
-
dynamic_cast转换如果成功返回的是指向类的指针或引用,转换失败则会返回NULL;
-
使用dynamic_cast转换,基类中一定要有虚函数,否则编译不通过;
需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。
3、const_cast
作用:用来修改表达式的const或volatile属性,即将一个不是const类型的数据转换成const类型,或者吧const属性去掉;
注意:const_cast不能用在不同的类型间转换
int x = 1;
const int* px = &x;
*px = 2; //编译错误
//正确方法
int* py = const_cast<int*>(px);
*py = 2;
4、reinterpret_cast
作用:有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。
(interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。)
总结
| 转换器 | 作用 |
|---|---|
| static_cast | 基本类型转换,低风险 |
| dynamic_cast | 类层次间上、下行转换,低风险 |
| const_cast | 去const属性,低风险 |
| reinterpret_cast | 转换不相关的类型,高风险 |
本文详细介绍了C++中的四种转换类型:static_cast用于基本类型转换,dynamic_cast处理类层次间的转换并增强安全性,const_cast用于修改const属性,reinterpret_cast用于任意类型间的转换。了解它们的区别与注意事项是编程中的关键。
4806

被折叠的 条评论
为什么被折叠?



