C++ 高级强制类型转换

本文详细介绍了C++中的四种高级强制类型转换关键字:static_cast、const_cast、reinterpret_cast和dynamic_cast。static_cast主要用于良性的转换,如基本数据类型转换、类层次结构中的转换,但不提供运行时类型检查。const_cast用于去掉const或volatile属性,但只能用于指针或引用。reinterpret_cast是一种低层次转换,可转换无关类型,但风险较高。dynamic_cast则在运行时进行类型检查,主要用于类继承层次间的安全向下转换,需要基类有虚函数。文章还提供了多个示例以帮助理解这些转换的使用和风险。
摘要由CSDN通过智能技术生成

强制类型转换

传统的强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。C语言的强制类型转换(Type Cast),有 显式和隐式两种:

显示类型转换:例如[ float a=(int)b ]
隐式类型转换:例如[ float a=3.75; int b=a; ]

高级的强制类型转换
C++由于对C进行了兼容,所以上述方式的类型转换在程序结构不复杂的情况下是足够的,但是当程序牵涉到了类的层次结构强制转换等复杂情况的时候上述方式的类型转换则会出现问题。为了 使强制转换的风险更加细化,使问题的追溯更加方便,使书写格式更加规范,C++语言中新增了四个强制类型转换的关键字:
1. static_cast :用于良性的转换,一般不会导致意外发生,风险低。
2. const_cast :用于const与非const,volatile与非volatile之间的转换。
3. reinterpret_cast :高度危险的转换,这种转换仅仅是对二进制位的重新解释,不会借助已有的转换规则对数据进行调整,但是可以实现最灵活的C++类型转换。
4. dynamic_cast:借助RTTI,用于类型安全的向下进行转型(Downcasting)

这四个关键字的语法格式都是一样的,具体为:

xxx_cast<newType-id>(expression);

其中newType-id是要转换成的新类型,expression是被转换的数据表达式,用法例如:

double scores=95.5;
int n=static_cast<int>(scores);
//结果n为95 

static_cast (静态转换)

最常见的高级强制转换运算符:用法为 static_cast< type-id >(expression)
static只能用于良性的转换,这样的转换风险较低,一般不会发生意外,但该运算符没有运行时类型检查来保证转换的安全性。

其主要用法如下:

1.用于基本数据类型的转换
例如short转int,int转double,const转非const,向上转型等…这种转换的安全性也要开发人员保证
例如:

🔥 下面的程序显示了使用类型强制转换表达式来防止发生整除法的示例
int a = 7;
int b = 3;
double r = static_cast<double>(a) / static_cast<double>(b);	 //结果为2.3333

2.用于类层次结构中的基类和派生类之间指针或引用的转换。
若进行上行转换(把派生类的指针或引用转换成基类表示),转换是安全的
若进行下行转换(把基类的指针或引用转换成派生类表示),同样由于没有动态类型检查,转换是不安全的
例如:

class Base
{
   public:};

class Dervied:public Base
{
   public:};

int main()
{
   
Base* base = new Base; //建立内存空间为基类Base类型,指针类型为基类的类指针base
Dervied* dervied = new Dervied;//建立内存空间为派生类Dervied类型,指针类型为派生类的类指针dervied

Dervied* DforBase = static_cast<Dervied*>(base);//🔥强制转换类型为基类的指针base为类型为派生类的指针DforBase 
Base* BforDervied = static_cast<Base*>(dervied);//🔥强制转换类型为派生的指针dervied为类型为基类的指针	BforDervied 
}

3.把空指针(void)和目标类型指针之间进行转换
例如[ void* ]转[ int* ],[ char* ]转[ void* ]等…
例如:

int *pint=static_cast<int*>(new(10*sizeof(int)));
🔥其中(new(10*sizeof(int)))为不指向任何类型的void指针

上述代码也可以这样写
void* pviod = new int(10*sizeof(int));//赋值10*4的整型值给pviod这个void指针变量
int* pint = static_cast<int*>(p);//强制转换void指针变量pvoid为int类型的指针变量pint
cout<<pviod <<"\n\n"<<*pint ;//打印void指针变量pvoid的地址和pint这个int类型指针指向的值

4.将具体类型指针,转换为void指针类型
例如:

int *a=new int(5);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值