C++primer1-7章知识点总结——显示转换

本文深入探讨了C++中四种强制类型转换(static_cast, const_cast, reinterpret_cast和命名的强制类型转换)的使用方法和注意事项。详细解释了每种转换的特点,如static_cast的广泛适用性和安全性,const_cast去除const属性的限制,以及reinterpret_cast的危险性和依赖于机器特性。文章强调了在使用这些转换时可能遇到的风险,并提供了实例说明。

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

warning:虽然有时候不得不使用强制类型转换,但这种方法本质上是非常危险的!

命名的强制类型转换:

形式:

cast-name<type>(expressopn)
//type是expression要转换的值。如果type是引用类型,则结果是左值。
static_cast

任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。

//进行强制类型转换以便执行浮点数除法
double slope = static_cast<double>(j) / i;

当需要把一个较大的算术类型赋值给较小的类型时,static_cast非常有用。(可以屏蔽编译器的警告信息,因为我们明确告知编译器不在乎损失潜在的精度)

对于编译器无法自动执行的类型转换也非常有用。
eg:

//使用static_cast找回存在于void*指针中的值
void* p = &d;
double *dp = static_cast<double*>(p) ;

这样操作时要注意确保指针的值保持不变。
也就是说强制转换的结果将与原始的地址值相等,因此我们必须确保转换后所得的类型就是指针所指的类型。类型一旦不符,将产生未定义的后果。

const_cast

只能改变运算对象的底层const,不能用其改变表达式的类型。

const char *pc;
char *p = const_cast<char*>(pc);//正确,但通过p写值是未定义的行为
//上述行为我们一般称其为“去掉const性质“
reinterpret_cast

使用该转换是非常危险的,其本质上依赖于机器。

为运算对象的为模式提供较低层次上的重新解释。

eg:

int *ip;
char *pc = reinterpret_cast<char*>(ip)
//pc所指的真实对象是一个int而非字符!
string str(pc);//错误,会产生导致异常运行的行为!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值