More Effective C++(条款二:最好使用C++转型操作符)

本文详细介绍了C++中四种类型转换操作符的使用方法及注意事项,包括static_cast、const_cast、dynamic_cast和reinterpret_cast,并通过具体示例展示了它们在实际编程中的应用。

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

1、static_cast

转型

旧式 :(type) expression

例:

int a=12,b=6;
double result=((double)a)/b;

现在:static_cast<type>(expression)

double result=static_cast<double>(a)/b;

2、const_cast

只可以用来移除表达式的常量性(或易变性)。

class Widge{...}//基类
class SpecialWidge:public Widge{...}//继承类
void update(SpecialWidge *psw);
SpecialWidge sw;//继承类对象
const SpecialWidge &csw=sw;//csw是代表sw的引用,视之为const对象
update(&csw);//错。不能将const SpecialWidge *传给需要SpecialWidge *的函数
update(const_cast<SpecialWidge *>(&csw));//对。&csw的常量性被移除了
update((SpecialWidge*)&csw);//同上。旧式写法
Widge *pw=new SpecialWidge;
update(pw);//pw是基类指针Widge*,update()需要参数SpecialWidge*
update(const_cast<SpecialWidge*>(pw));//错。const_cast只能改变常量性,无法进行继承体系的向下转型动作

3、dynamic_cast

只能用在继承体系中,将“指向基类对象的指针或引用”转型为“指向继承类对象的指针或引用”

若转型失败,会以一个null指针(当转型对象是指针)或一个exception(当转型对象是引用)表现出来。

Widge *pw;
...
update(dynamic_cast<SpecialWidge*>(pw));//对。传给update()一个指针,指向pw所指的SpecialWidge
                                        //若pw真指向这样的东西。否则,传过去的是null指
void updateViaRef(SpecialWidge &rsw);
updateViaRef(dynamic_cast<SpecialWidge&>(*pw));//对。传给updateViaRef()的是pw指向的SpecialWidge
                                               // 若pw真指向这样的东西。否则抛出一个exception

int a=4,b=2;
double result=dynamic_cast<double>(a)/b;//错。未涉及继承体系

const SpecialWidge sw;
...
update(dynamic_cast<SpecialWidge*>(&sw));//错。dynamic_cast不能改变常量性

4、reinterpret_cast

转换函数指针类型。

例:

设有一数组,存储的是函数指针,有特定类型:

typedef void (*FuncPtr)();//FuncPtr是函数指针,指向某个函数,该函数无参数,返回类型为void
FuncPtr funcPtrArray[10];//funcPtrArray是个数组,有10个FuncPtr

若想将以下函数的一个指针n放入该数组:

int dosomething();

dosomething的类型与funcPtrArray接受的类型不同。funcPtrArray内各函数指针所指向的函数返回类型是void

funcPtrArray[0]=&dosomething;//错
funcPtrArray[0]=reinterpret_cast<FuncPtr>(&dosomething);//对。
函数指针的转型动作不具移植性(C++不保证所有的函数指针都能以此方式重新呈现)。某些情况下这样的转型可能会导致不正确的结果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值