c++ || 类型强转

本文详细介绍了C++中的四种类型转换:static_cast用于静态类型转换,不包含底层const的安全转换;const_cast用于改变变量的const属性;reinterpret_cast用于指针间的强制转换;dynamic_cast则在基类与子类之间进行动态类型转换,具有运行时安全性检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

类型强转的一般形式为:cast-name< type >(expression)

顶层const:指针本身是个常量;int * const p;
底层const:指针所指对象是个常量;
int const *p;

  1. static_cast(静态类型转换):只要不包括底层const,任何具有明确定义的类型转换都可以用,运行时不进行安全检查
  • 可以用于类层次结构中基类与子类之间指针或引用的转换
    把子类的指针或引用转换成基类表示是安全的,但把基类的指针或引用转换成子类指针或引用时,由于没有动态类型检查,所以是不安全的,因此基类与子类之间的动态类型转换建议用dynamic_cast

1.基本数据类型转换
2.把空指针转换成目标类型的空指针
3.把任何类型的表达式转换成void类型
4.static_cast不能去掉类型的const、volitale属性
5.static_cast不能进行无关类型指针之间的转换

int n = 6;
double d = static_cast<double>(n);
int *p=&n;
void *q = static_cast<void*>(p);
  1. const_cast(去const类型转换):只能改变底层的const
    const_cast用来修改类型的const或volatile属性,会操纵传递对象的const属性,设置或移除该属性

去掉const属性:const_cast<int*> (&num),常用,因为不能把一个const变量直接赋给一个非const变量,必须要转换。

加上const属性:const int* k = const_cast<const int*>(j),一般很少用,因为可以把一个非const变量直接赋给一个const变量,比如:const int* k = j;

  1. reinterpret_cast(重新解释类型转换):
  • 在指针之间进行转换,将一种类型的指针转换为另一种类型的指针
  • 将指针转换为一个整型数,但不能用于非指针类型的转换
  1. dynamic_cast(动态类型转换):将基类的指针或引用转换为派生类的指针或引用,运行时进行安全检查

对指针进行dynamic_cast:失败null,成功返回正常cast后的对象指针
对引用进行dynamic_cast:失败抛出异常 bad_cast,成功返回正常cast后的对象指针

从派生类到基类,指针、引用都是安全的

从基类到派生类:基类指针所指对象是派生类类型,转换安全;基类指针所指对象为基类类型,dynamic_cast在运行时要检查,转换失败,返回结果0.
必须要有虚函数


BaseClass* pb =new DerivedClass();
DerivedClass *pd1 = static_cast<DerivedClass *>(pb); //子类->父类,静态类型转换,正确但不推荐
DerivedClass *pd2 = dynamic_cast<DerivedClass *>(pb); //子类->父类,动态类型转换,正确
 
BaseClass* pb2 =new BaseClass();
DerivedClass *pd21 = static_cast<DerivedClass *>(pb2); //父类->子类,静态类型转换,危险!访问子类m_szName成员越界
DerivedClass *pd22 = dynamic_cast<DerivedClass *>(pb2); //父类->子类,动态类型转换,安全的。结果是NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值