C++的四种转型操作

C++的四种转型操作

1.C语言的旧式转型操作

旧式转型的语法结构是由一对小括号加上一个对象名称组成

(type) expression

缺点在于:

  • 几乎允许将不论什么类型转换为不论什么其它类型,有其自身的缺陷,不能精确的指明转型的意图;
  • 旧式转型难以辨识,而这种语法结构在C++的任何地方都有可能使用,这就无法很直观地判断出是否是转型操作。

为解决C旧式转型的缺点,C++导入了4个新的转型操作符:static_cast、const_cast、dynamic_cast、reinterpret_cast。
下面分别介绍:

  1. static_cast: 基本与拥有与C旧式转型相同的威力与意义,以及相同的限制。
int a=10 ,b=15;
double c = double(a) / b;//旧式的转型操作
double d = static_cast<double>(a) / b;//新式的转型操作
  1. const_cast: 用来改变表达式中的常量性(constness)或易变性(volatileness)
int a;
const int* pa = &a;
int* pa1 = pa;//error:cannot convert from 'const int*' to 'int*' 
int* pa2 = (int*)pa;//旧式的转型操作
int* pa3 = const_cast<int*>(pa);
  1. dynamic_cast: 运用于继承体系中“安全的向下转型或跨系转型动作”。
       你能够利用dynamic_cast。将”指向base class objects的pointers或references“转型为”指向derived(或sibling base)class objects的pointers或references“,并得知转型是否成功。
       假设转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是reference)表现出来。
class Cbase{};
class Dbase:public Cbase {};
Dbase db;
Dbase* pdb=&db;
Cbase* pcb=dynamic_cast<Dbase*>(pdb);
Cbase& rcb=dynamic_cast<Dbase&>(db);
  1. reinterpret_cast: 最常用的用途是转换"函数指针"类型,实际结果取决于编译器。
typedef void(*funcPtr)(void);//funcPtr是一个指向返回值为空参数为空类型的函数指针
int iFunc(){ return 0; }//iFunc是一个返回值为整数参数为空的函数
void func(funcPtr f){}//func是一个返回值为空参数为funcPtr函数指针的函数
int main ()
{
	func(iFunc);//error!iFunc的类型不是funcPtr
	func(reinterpret_cast<funcPtr>(iFunc));//用reinterpret_cast转换符将一个返回值为整数参数为空的
	                                       //函数指针类型转换为一个指向返回值为空参数为空类型的函数指针
}

参考网站

C++转型操作符 https://www.cnblogs.com/einyboy/p/3181299.html
C++中的四种转型操作符 https://www.cnblogs.com/mengfanrong/p/5241696.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值