在C++中,有哪4个与类型转换相关的关键字?这些关键字各有什么特点,应该在什么场合下使用?

在C++中,有哪4个与类型转换相关的关键字?这些关键字各有什么特点,应该在什么场合下使用?

1reinterpret_cast< type-id > ( expression )

reinterpret_cast是C++里面的一个强制类型转换符,能够将任何的指针类型转换成其他的任何指针类型;能够将任何的整数类型转换成指针类型,反之亦然;滥用reinterpret_cast强制类型转换符不安全。除非要转换成的类型是固有的低级别的,不然要考虑使用其他的转换操作符。

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,再把该整数转换成原类型的指针,还可以得到原先的指针值)。

areinterpret_cast强制类型转换符能够将字符串类型的指针转换成整型指针(char * -> int *),某个类类型的指针转换成另外一个不相关类类型的指针(classA * -> class B *);这些转换不安全。

b、使用reinterpret_cast强制转换之后的结果很不安全,除非用来转换成它的原始类型。

creinterpret_cast不能用来移除变量的constvolatile等属性。

dreinterpret_cast可以将一个空类型的指针转换成一个目标类型的空指针值。

2static_cast < type-id > ( expression)

static_cast将要转换的expression唯一的转换成type_id类型,在运行的时候也不检测是否这种转换之后的结果安全性。主要用于c++中内置的基本数据类型之间的转换,在编译期间处理,但是没有运行时类型的检测来保证转换的安全性。

a、将一个基类的指针转换成派生类的指针,但是这种转换经常很不安全。但是将一个基类指针转换成基类指针或将派生类指针转换成派生类指针是安全的。用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。进行上行转换(把派生类的指针或引用转换成基类表示)是安全;进行下行转换(把基类指针或引用转换成派生类表示时)由于没有动态类型检查,所以是不安全的。

b、static_cast可以执行任何的隐式转换,包括标准类型和用户自定义类型。如基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。

c、static_cast可以显式的将整型转换成枚举类型,如果整型数据的值不在枚举类型值的范围之类,那么该枚举类型的值无效。

d、static_cast可以将任何expression显式的转换成空类型,转换后的空类型可以选择性的包含const、volatile等属性。

e、static_cast不能用来移除变量的const、volatile等属性。

把空指针转换成目标类型的空指针。把任何类型的表达式转换成void类型。

static_cast和reinterpret_cast的区别主要在于多重继承C++primer第五章里写了编译器隐式执行任何类型转换都可由static_cast显示完成;reinterpret_cast通常为操作数的位模式提供较低层的重新解释。

3.const_cast < type-id > ( expression )

const_cast可以用于移除类型const、volatile等属性。该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外,type_id和expression的类型是一样的。

a、常量指针转换成非常量指针,指针仍然指向原来的对象,转换后,可以通过指针修改对象的值。

b、常量引用被转换成非常量引用,仍然引用原来的对象。

c、const_cast可以将一个空类型的指针转换成一个目标类型的空指针值。Const_cast一般用于修改底指针。如const char *p形式。

4.dynamic_cast < type-id > ( expression )

该运算符将expression转换成type_id类型的对象。type_id必须是类的指针,类的引用或者空类型的指针。

a、如果type_id是一个指针类型,那么expression也必须是一个指针类型,如果type_id是一个引用类型,那么expression也必须是一个引用类型。

b、如果type_id是一个空类型的指针,在运行的时候,就会检测expression的实际类型,结果是一个由expression决定的指针类型。

c、如果type_id不是空类型的指针,在运行的时候指向expression对象的指针能否可以转换成type_id类型的指针。
d、在运行的时候决定真正的类型,如果向下转换是安全的,就返回一个转换后的指针,若不安全,则返回一个空指针。

e、主要用于上下行之间的转换,也可以用于类之间的交叉转换。上行转换时和static_cast效果一样,下行转换时,具有检测功能,比static_cast更安全。

dynamic_cast运算符可以在执行期决定真正的类型。如果 downcast 是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果 downcast 不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值