《C++ primer》 中 强制类型转换

本文详细介绍了 C++ 中四种强制类型转换符号:dynamic_cast、const_cast、static_cast 和 reinterpret_cast 的使用方法及特点。dynamic_cast 主要用于类层次间的上行转换和下行转换,并具备类型检查功能;const_cast 用于去除 const 属性;static_cast 可以完成编译器隐式执行的类型转换;而 reinterpret_cast 则提供了更低层次的位模式重新解释。

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

命名的强制类型转换符号一般形式如下:

cast-name<type>(expression);

其中cast-name为static_cast,dynamic_cast,const_cast,reinterpret_cast之一,type为转换目标,而expression为被强制类型转换的值。强制转换的类型指定了在expression上执行某种特定类型的转换。

1.dynamic_cast

dynamic_cast支持运行时识别指针或者所指向的对象。

该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void*;
如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
dynamic_cast运算符可以在执行期决定真正的类型。如果downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

2.const_cast

const_cast是将转换掉表达式const的性质。例如,假设由函数string_copy,我们对其唯一的char*类型参数制度不写,在访问改函数时买最好的选择是修改它让它接受const char*类型的参数,如果不行,可通过const_cast用一个const值调用string_copy函数:

const char *pc_str;

char *pc = string_copy(const_cast<char*>(pc_str));

只有使用const_cast才能将const性质转换掉,在这种情况下,试图使用其他三种形式的强制转换都会导致编译时的错误

3.static_cast

编译器隐式执行额任何类型转换都可以由static_cast显式完成:

double d = 97.0;

char ch = static_cast<char>(d);

当需要将一个较大的算术类型赋值给较小的类型时,使用强制类型转换非常有用。此时强制类型转换将告诉编译器:我们知道并且不关心潜在的精度损失。

如果编译器不提供自动转换,使用static_cast来执行类型转换也是很有用的。例如,下面的程序使用static_cast找回存在在void*指针中的值:

void* p = &d;

double *dp = static_cast<double*>(p);

可以通过static_cast将存放在void*中的指针值强制转换为原来的指针类型,此时我们应确保保持指针值,也就是说,强制类型转换的结果应与原来的地址值相等。

4.reinterpret_cast

reinterpret_cast通常为操作数的位模式提供较低层次的重新解释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值