软件开发工程师修炼中|
📂C/C++
🔖cpp
2022-08-05 23:04阅读: 79评论: 0推荐: 0

【C++笔记】C++中的显式强制类型转换

C++的强制类型转换

C++中命名的强制转换类型有如下形式:

cast-name<type>(expression);

其中cast-name指定了执行的是哪种转换,一共有四种,分别是static_cast、dynamic_cast、const_cast和reinterpret_cast。

static_cast

这个我的理解就是和C语言中的强转相同,书中进一步提到任何具有明确定义的类型转换,只要不包含底层const都可以使用static_cast。另外,static_cast对于编译器无法自动执行的类型转换也很有用,例如可以使用static_cast找回存在于void*指针中的值:

void *p = &d; 
double *dp = static_cast<double*>(p); // 将void*转换回初始的指针类型
// 这里需要注意下强转成原来的类型时,要确保指针的值保持不变,也就是说,确保转换后所得的类型就是指针实际所指的类型,否则可能会产生未定义的行为

const_cast

const_cast用于改变运算对象的底层const,在涉及底层const和顶层const的内容时顶层const与底层const提到,当将非常量赋值给常量时,这种行为是不被允许的,但是使用const_cast之后,就可以实现这种转换:

const char *pc;
char *p = pc; // 错误,不能使用常量指针去初始化非常量指针
char *p = const_cast<char*>(pc); // 正确,但是不能通过p写值

书中提到虽然进行了强制类型转换,但是如果进行了写操作,仍然会产生未定义的行为。这里我的理解是,虽然赋值行为没有产生问题,但是没有改变对象是常量这个事实,想改变常量的值就会报错,因此并不是实际意义上的去掉了const性质,而只是让赋值过程不产生问题而已。

reinterpret_cast

书里面说的比较难理解:“为运算对象的位模式提供较低层次上的重新解释”,但是举例之后就比较明白了:

int *ip;
char *pc = reinterpret_cast<char*>(ip);

这里直接将指向int类型的指针强制转换成char*,然后赋值给pc,但是要记住pc实际所指的是一个int,而不是char,所以如果进行有关字符串的操作时,会报错,要格外注意。
因此,可以看到这种类型的强制转换作用非常强大,但是也很容易出现问题,我个人觉得在编程时要尽量少用。

dynamic_cast

这个后续学到的时候再进行补充

总结

与C语言使用的强转方式(type)expr相比,C++的这种方式对强转进行了更加细致的分类,使得看代码的人在看到这种强转的时候能明白是进行了什么样的强转,出了问题也更加容易进行检查。


参考文献:

C++ primer 第五版

本文作者:无涯清酒

本文链接:https://www.cnblogs.com/wuyawine/p/16556084.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   无涯清酒  阅读(79)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起