方式 | 说明 | 示例 |
---|---|---|
static_cast | 用于基本类型之间、类继承体系之间的转换 | int -> double Derived* -> Base* |
const_cast | 用于移除变量的const、volatile等属性 | const int -> int |
dynamic_cast | 用于类继承体系之间的安全向下转换,转换失败返回NULL | Derived* -> Base* |
reinterpret_cast | 用于不相关类型之间的转换,结果不安全,需慎用 | int* -> char* |
比较这四种转换方式,主要区别在于:
-
static_cast
: 编译时检查转换是否有效,只在相关类型之间转换,比较安全。 -
const_cast
: 只影响变量的const属性,不改变实际类型,对指针 moderately unsafe。 -
dynamic_cast
: 运行时检查转换是否有效,只在继承体系中向下转换,比较安全。 -
reinterpret_cast
: 完全不检查转换是否有效,在任意类型之间转换,很不安全,容易导致 undefined behavior。
总的来说:文章来源:https://www.toymoban.com/news/detail-425147.html
-
static_cast
和const_cast
相对安全,dynamic_cast
在继承体系中也比较安全。 -
reinterpret_cast
是最不安全的,使用时需特别小心。 - 内置类型转换建议优先使用
static_cast
。 - 类继承体系转换建议优先使用
dynamic_cast
。强制类型转换是C++强大特性的一部分,但也容易引起意外错误。理解每种转换的精确语义和用途,可以更好地运用这些特性,并在出现问题时快速定位与修复。
示例:文章来源地址https://www.toymoban.com/news/detail-425147.html
- 静态转换(**static_cast)**用于在相关类型之间进行转换,比如:- 基本数据类型之间的转换,如int到double
- 指针到指针的转换,如父类指针到子类指针
- 整型到枚举的转换
- 等等示例:
cpp
int a = 1;
double b = static_cast<double>(a);
class Base {...};
class Derived extends Base {...};
Base* b = new Derived();
Derived* d = static_cast<Derived*>(b);
- const_cast用于移除变量的const、volatile和__restrict__属性。示例:
cpp
const int a = 1;
int* b = const_cast<int*>(&a);
*b = 2; // 现在可以修改a
- dynamic_cast用于在具有继承关系的类之间进行安全向下转换,如果转换失败会返回NULL。示例:
cpp
class Base {...};
class Derived extends Base {...};
Base* b = new Base();
Derived* d = dynamic_cast<Derived*>(b); // d is NULL
b = new Derived();
d = dynamic_cast<Derived*>(b); // ok, d is not NULL
- reinterpret_cast用于在不相关的类型之间进行转换,这种转换是不安全的,会造成意想不到的结果。要慎用。示例:
cpp
int* a = new int(1);
char* b = reinterpret_cast<char*>(a);
// 现在b指向a指向的内存,但被当作char*使用
到了这里,关于c++面试——强制类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!