c++面试——强制类型转换

方式说明示例
static_cast用于基本类型之间、类继承体系之间的转换int -> double
Derived* -> Base*
const_cast用于移除变量的const、volatile等属性const int -> int
dynamic_cast用于类继承体系之间的安全向下转换,转换失败返回NULLDerived* -> Base*
reinterpret_cast用于不相关类型之间的转换,结果不安全,需慎用int* -> char*

比较这四种转换方式,主要区别在于:

  • static_cast: 编译时检查转换是否有效,只在相关类型之间转换,比较安全。
  • const_cast: 只影响变量的const属性,不改变实际类型,对指针 moderately unsafe。
  • dynamic_cast: 运行时检查转换是否有效,只在继承体系中向下转换,比较安全。
  • reinterpret_cast: 完全不检查转换是否有效,在任意类型之间转换,很不安全,容易导致 undefined behavior。

总的来说:

  • static_castconst_cast相对安全,dynamic_cast在继承体系中也比较安全。
  • reinterpret_cast是最不安全的,使用时需特别小心。
  • 内置类型转换建议优先使用static_cast
  • 类继承体系转换建议优先使用dynamic_cast。强制类型转换是C++强大特性的一部分,但也容易引起意外错误。理解每种转换的精确语义和用途,可以更好地运用这些特性,并在出现问题时快速定位与修复。

示例:

  1. 静态转换(**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); 
  1. const_cast用于移除变量的const、volatile和__restrict__属性。示例:
cpp
const int a = 1;
int* b = const_cast<int*>(&a);
*b = 2;  // 现在可以修改a
  1. 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
  1. reinterpret_cast用于在不相关的类型之间进行转换,这种转换是不安全的,会造成意想不到的结果。要慎用。示例:
cpp 
int* a = new int(1);
char* b = reinterpret_cast<char*>(a); 
// 现在b指向a指向的内存,但被当作char*使用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值